{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "ab0a16c5",
   "metadata": {},
   "source": [
    "## 之前的实验效果都没啥提升，我太难过了，再尝试加入新的特征---我可以多模仿陈姗姗论文里写的\n",
    "- 加入句法分析树深度特征：句子深度最大值/平均值/平均从句数量/平均从句长度/句子平均动词、名词、情态动词、介词、标点数目/句法的复杂程度 比如说多少个主谓关系/动宾关系等等\n",
    "- 加入语法检错特征 （我觉得这个特征很重要呀！有了这个特征估计评分会准确很多）：以 3-gram 词汇组合为例，“like going to”在维基百科中的词频为 425，而“like  go  to”的词频仅仅为 25，可以看出词频较小的词汇组合可能与文本中语法的错误相关；设定不同的窗口大小，得到不同窗口大小下的词汇组合，然后看这个词汇组合在维基百科数据下的文本出现频率，再把作文的这些频率加和取平均吧，这样就可以得到整个作文的词汇正确频率大小了\n",
    "- 长度大于4,6,8,10,12的词汇个数  --复现陈姗姗论文\n",
    "- 长度大于5/10/15/25的句子 --复现陈姗姗论文\n",
    "- 文本情感特征\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 164,
   "id": "2b56b5b1",
   "metadata": {},
   "outputs": [],
   "source": [
    "import os\n",
    "import nltk\n",
    "import pandas as pd\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "from nltk.stem import WordNetLemmatizer\n",
    "from nltk.corpus import wordnet\n",
    "import re, collections\n",
    "from collections import defaultdict\n",
    "from sklearn.feature_extraction.text import CountVectorizer\n",
    "from sklearn.metrics import mean_squared_error, r2_score\n",
    "from sklearn.model_selection import train_test_split\n",
    "from sklearn.linear_model import LinearRegression, Ridge, Lasso\n",
    "from sklearn.ensemble import RandomForestClassifier\n",
    "from sklearn import ensemble\n",
    "from sklearn.model_selection import GridSearchCV\n",
    "#import xgboost as xgb\n",
    "import matplotlib.pyplot as plt\n",
    "from sklearn.metrics import cohen_kappa_score\n",
    "from nltk.corpus import stopwords\n",
    "from nltk import word_tokenize, pos_tag\n",
    "from nltk.corpus import wordnet\n",
    "from nltk.stem import WordNetLemmatizer\n",
    "#nltk.download('stopwords')"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "d17d7315",
   "metadata": {},
   "source": [
    "## 读取数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "ebefc560",
   "metadata": {},
   "outputs": [],
   "source": [
    "essay_csv = \"essay_test.csv\"\n",
    "\n",
    "dataframe = pd.read_csv(essay_csv, encoding = 'latin-1')\n",
    "#copy一份数据\n",
    "data = dataframe[['id','essay','score']].copy()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "856d9d53",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>id</th>\n",
       "      <th>essay</th>\n",
       "      <th>score</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>10001</td>\n",
       "      <td>Dear Jerry. I've heard about that you will giv...</td>\n",
       "      <td>19.5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>10002</td>\n",
       "      <td>Dear Jerry I'm glad that you'll respresent you...</td>\n",
       "      <td>16.5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>10003</td>\n",
       "      <td>Dear Jerry, I am very happy to hear that you w...</td>\n",
       "      <td>20.5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>10004</td>\n",
       "      <td>Dear Je I'm so happy to hear that you will hav...</td>\n",
       "      <td>15.5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>10005</td>\n",
       "      <td>Dear Jerry, I am so glad to hear that you will...</td>\n",
       "      <td>19.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "      id                                              essay  score\n",
       "0  10001  Dear Jerry. I've heard about that you will giv...   19.5\n",
       "1  10002  Dear Jerry I'm glad that you'll respresent you...   16.5\n",
       "2  10003  Dear Jerry, I am very happy to hear that you w...   20.5\n",
       "3  10004  Dear Je I'm so happy to hear that you will hav...   15.5\n",
       "4  10005  Dear Jerry, I am so glad to hear that you will...   19.0"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "d8806e1b",
   "metadata": {},
   "source": [
    "## 数据预处理--替换缩写"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "9c15acc9",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 首先对句子做一个清洗，需要把缩写转换为原来的单词，如把I'm 转换成I am\n",
    "def covert_abb2words(essay):\n",
    "    #essay = essay.lower()\n",
    "    essay = essay.replace(\"I'm\",\"I am\").replace(\"'ve\",\" have\").replace(\"'ll\",\" will\").replace(\"n't\",\" not\")\n",
    "    return essay"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "5f38f4e3",
   "metadata": {},
   "outputs": [],
   "source": [
    "data[\"corrected\"] = data.apply(lambda x : covert_abb2words(x[\"essay\"]),axis=1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "4e16eea0",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>id</th>\n",
       "      <th>essay</th>\n",
       "      <th>score</th>\n",
       "      <th>corrected</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>10001</td>\n",
       "      <td>Dear Jerry. I've heard about that you will giv...</td>\n",
       "      <td>19.5</td>\n",
       "      <td>Dear Jerry. I have heard about that you will g...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>10002</td>\n",
       "      <td>Dear Jerry I'm glad that you'll respresent you...</td>\n",
       "      <td>16.5</td>\n",
       "      <td>Dear Jerry I am glad that you will respresent ...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>10003</td>\n",
       "      <td>Dear Jerry, I am very happy to hear that you w...</td>\n",
       "      <td>20.5</td>\n",
       "      <td>Dear Jerry, I am very happy to hear that you w...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>10004</td>\n",
       "      <td>Dear Je I'm so happy to hear that you will hav...</td>\n",
       "      <td>15.5</td>\n",
       "      <td>Dear Je I am so happy to hear that you will ha...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>10005</td>\n",
       "      <td>Dear Jerry, I am so glad to hear that you will...</td>\n",
       "      <td>19.0</td>\n",
       "      <td>Dear Jerry, I am so glad to hear that you will...</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "      id                                              essay  score  \\\n",
       "0  10001  Dear Jerry. I've heard about that you will giv...   19.5   \n",
       "1  10002  Dear Jerry I'm glad that you'll respresent you...   16.5   \n",
       "2  10003  Dear Jerry, I am very happy to hear that you w...   20.5   \n",
       "3  10004  Dear Je I'm so happy to hear that you will hav...   15.5   \n",
       "4  10005  Dear Jerry, I am so glad to hear that you will...   19.0   \n",
       "\n",
       "                                           corrected  \n",
       "0  Dear Jerry. I have heard about that you will g...  \n",
       "1  Dear Jerry I am glad that you will respresent ...  \n",
       "2  Dear Jerry, I am very happy to hear that you w...  \n",
       "3  Dear Je I am so happy to hear that you will ha...  \n",
       "4  Dear Jerry, I am so glad to hear that you will...  "
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "68285ffc",
   "metadata": {},
   "source": [
    "## 浅层信息提取"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "5be23c75",
   "metadata": {},
   "outputs": [],
   "source": [
    "example = '''\n",
    "Dear Jerry I'm gale that you can get an English leature for high school Gread one I know you have many diffict need to solve. I'll try my best to help you. I belive that you can do well. you also should try your best to do. You say that have many don't know thing. These thing are so easy. You don't worry about more this. Firstly. you should read the leature again and again. to know about comply. This is a bab. Sencondly. you should have active bodly baod to let your leature become interesting and active and acttilt. I belive you can do well Fillaly you need to say that Thanks you come there listen to my leature. then come back friendly. These thing I belive that you can do well. look farward to you Yours, Li Hua\n",
    "\n",
    "'''"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a52023e1",
   "metadata": {},
   "source": [
    "### 词法特征"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "4011c26b",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 把每个句子都拆成单词列表\n",
    "def tokenize(essay):\n",
    "    # 去掉句子前后空格\n",
    "    stripped_essay = essay.strip()\n",
    "    tokenizer = nltk.data.load('tokenizers/punkt/english.pickle')\n",
    "    raw_sentences = tokenizer.tokenize(stripped_essay) # 分句\n",
    "    #print(raw_sentences)\n",
    "    tokenized_sentences = []\n",
    "    for raw_sentence in raw_sentences:\n",
    "        if len(raw_sentence) > 0:\n",
    "            tokenized_sentences.append(sentence_to_wordlist(raw_sentence))\n",
    "    return tokenized_sentences"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "36decd78",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 返回总的单词列表\n",
    "def sentence_to_wordlist(raw_sentence):\n",
    "    #句子清洗\n",
    "    # re的用法：replacedStr = re.sub(\"\\d+\", \"222\", inputStr)\n",
    "    clean_sentence = re.sub(\"[^a-zA-Z0-9]\", \" \", raw_sentence)# 这里主要是去除除了a-zA-Z0-9之外的字符\n",
    "    #nltk 分词\n",
    "    tokens = nltk.word_tokenize(clean_sentence)\n",
    "    #返回分词的结果\n",
    "    return tokens"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "b0523eaf",
   "metadata": {},
   "outputs": [],
   "source": [
    "## 作文长度 1\n",
    "def essay_len(raw_sentence):\n",
    "    #句子清洗\n",
    "    # re的用法：replacedStr = re.sub(\"\\d+\", \"222\", inputStr)\n",
    "    clean_sentence = re.sub(\"[^a-zA-Z0-9]\", \" \", raw_sentence)# 这里主要是去除除了a-zA-Z0-9之外的字符\n",
    "    #nltk 分词\n",
    "    tokens = nltk.word_tokenize(clean_sentence)\n",
    "    #返回分词的结果\n",
    "    return len(tokens)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 64,
   "id": "b578c3e7",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "144"
      ]
     },
     "execution_count": 64,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "essay_len(example)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "id": "4db6f4fd",
   "metadata": {},
   "outputs": [],
   "source": [
    "## 去停用词，去重后的词表大小 2\n",
    "def richness(essay):\n",
    "    clean_essay = re.sub(\"[^a-zA-Z0-9]\", \" \", essay)\n",
    "    tokens = nltk.word_tokenize(clean_essay)\n",
    "    words = stopwords.words('english')\n",
    "    filtered_words = [word for word in tokens if word not in words]\n",
    "    return len(set(filtered_words))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 272,
   "id": "243e0a00",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "52"
      ]
     },
     "execution_count": 272,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "richness(example)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 273,
   "id": "0cc87f21",
   "metadata": {},
   "outputs": [],
   "source": [
    "## 词表大小占作文长度的比例 3\n",
    "def rich_divide_total(essay):\n",
    "    p = richness(essay)/essay_len(essay)\n",
    "    return round(p,8)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 274,
   "id": "2c3f72d0",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.36111111"
      ]
     },
     "execution_count": 274,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "rich_divide_total(example)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "id": "080f9ed1",
   "metadata": {},
   "outputs": [],
   "source": [
    "## 平均词汇长度 4\n",
    "# 平均词数\n",
    "def avg_word_len(essay):\n",
    "    # 清洗文章\n",
    "    clean_essay = re.sub(r'\\W', ' ', essay)\n",
    "    # 分词\n",
    "    words = nltk.word_tokenize(clean_essay)\n",
    "    # 遍历word，然后把每一个word的单词数目相加，然后除以总的单词数目，即可得到 每个单词平均有几个字母\n",
    "    p = sum(len(word) for word in words) / len(words)\n",
    "    return round(p,8)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "id": "af8bac10",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "3.89583333"
      ]
     },
     "execution_count": 39,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "avg_word_len(example)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 83,
   "id": "91d5f46d",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 名词 形容词 动词 介词 副词 5 6 7 8 9\n",
    "def count_pos(essay):\n",
    "    length = essay_len(essay)\n",
    "    tokenized_sentences = tokenize(essay)\n",
    "\n",
    "    noun_count = 0\n",
    "    adj_count = 0\n",
    "    verb_count = 0\n",
    "    adv_count = 0\n",
    "    pre_count = 0\n",
    "    conj_count = 0\n",
    "\n",
    "    for sentence in tokenized_sentences:\n",
    "        tagged_tokens = nltk.pos_tag(sentence)\n",
    "\n",
    "        for token_tuple in tagged_tokens:\n",
    "            pos_tag = token_tuple[1]\n",
    "\n",
    "            if pos_tag.startswith('N'):\n",
    "                noun_count += 1\n",
    "            elif pos_tag.startswith('J'):\n",
    "                adj_count += 1\n",
    "            elif pos_tag.startswith('V'):\n",
    "                verb_count += 1\n",
    "            elif pos_tag.startswith('R'):\n",
    "                adv_count += 1\n",
    "            elif pos_tag.startswith('IN'):\n",
    "                pre_count +=1\n",
    "            elif pos_tag.startswith('CC'):\n",
    "                conj_count += 1\n",
    "\n",
    "    return noun_count/length, adj_count/length, verb_count/length, adv_count/length,pre_count/length,conj_count/length"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 84,
   "id": "f9be3dd9",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(0.14583333333333334,\n",
       " 0.09722222222222222,\n",
       " 0.2569444444444444,\n",
       " 0.09722222222222222,\n",
       " 0.04861111111111111,\n",
       " 0.020833333333333332)"
      ]
     },
     "execution_count": 84,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "count_pos(example)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 78,
   "id": "803a84b3",
   "metadata": {},
   "outputs": [],
   "source": [
    "## 长度大于4,6,8,10,12的词汇个数 10 11 12 13 14\n",
    "def words_len(essay):\n",
    "    four_len = 0\n",
    "    six_len = 0\n",
    "    eight_len = 0\n",
    "    ten_len = 0\n",
    "    twl_len = 0\n",
    "    for word in sentence_to_wordlist(essay):\n",
    "        if len(word) >= 12:\n",
    "            twl_len+=1\n",
    "        elif len(word) >= 10:\n",
    "            ten_len+=1\n",
    "        elif len(word) >= 8:\n",
    "            eight_len+=1\n",
    "        elif len(word) >= 6:\n",
    "            six_len+=1\n",
    "        elif len(word) >= 4:\n",
    "            four_len+=1\n",
    "    \n",
    "    return four_len,six_len,eight_len,ten_len,twl_len\n",
    "            "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 79,
   "id": "655761cb",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(0, 1, 2, 23, 54)"
      ]
     },
     "execution_count": 79,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "words_len(example)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 80,
   "id": "e08fd8cd",
   "metadata": {},
   "outputs": [],
   "source": [
    "## 拼写错误词汇个数 15\n",
    "# 这里需要定制化一下，加入li 和hua 这两个词\n",
    "def count_spell_error(essay):\n",
    "    clean_essay = re.sub(r'\\W', ' ', str(essay).lower())\n",
    "    clean_essay = re.sub(r'[0-9]', '', clean_essay)\n",
    "\n",
    "    # big.txt: It is a concatenation of public domain book excerpts from Project Gutenberg\n",
    "    #         and lists of most frequent words from Wiktionary and the British National Corpus.\n",
    "    #         It contains about a million words.\n",
    "    data = open('big.txt').read()\n",
    "\n",
    "    words_ = re.findall('[a-z]+', data.lower())\n",
    "\n",
    "\n",
    "    word_dict = collections.defaultdict(lambda: 0)\n",
    "\n",
    "    for word in words_:\n",
    "        word_dict[word] += 1\n",
    "\n",
    "    clean_essay = re.sub(r'\\W', ' ', str(essay).lower())\n",
    "    clean_essay = re.sub(r'[0-9]', '', clean_essay)\n",
    "\n",
    "    mispell_count = 0\n",
    "    mispell_words = []\n",
    "\n",
    "    words = clean_essay.split()\n",
    "\n",
    "    for word in words:\n",
    "        # 针对该文本的特殊词汇\n",
    "        if word not in [\"li\",\"hua\",\"jerry\"]:\n",
    "            # 如果essay中的词汇不在big data 这个文件下，那么就认为这个单词拼写错了\n",
    "            if not word in word_dict:\n",
    "                mispell_count += 1\n",
    "                mispell_words.append(word)\n",
    "\n",
    "    return mispell_count"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 81,
   "id": "cdbc4be2",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 16\n",
    "def char_count(essay): \n",
    "    # 删除空格即返回文章字母总数\n",
    "    clean_essay = re.sub(r'\\s', '', str(essay).lower())\n",
    "    return len(clean_essay)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 85,
   "id": "08b6629a",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 提取出所有的名词 形容词 动词 副词 17 \n",
    "def count_lemmas(essay):\n",
    "    #分句\n",
    "    tokenized_sentences = tokenize(essay)\n",
    "    lemmas = []\n",
    "    wordnet_lemmatizer = WordNetLemmatizer()\n",
    "\n",
    "    for sentence in tokenized_sentences:\n",
    "        # 给句子标注词性\n",
    "        tagged_tokens = nltk.pos_tag(sentence)\n",
    "        for token_tuple in tagged_tokens:\n",
    "            # 取第一个，即为该单词词性\n",
    "            pos_tag = token_tuple[1]\n",
    "            if pos_tag.startswith('N'):\n",
    "                pos = wordnet.NOUN\n",
    "                lemmas.append(wordnet_lemmatizer.lemmatize(token_tuple[0], pos))\n",
    "                \n",
    "            elif pos_tag.startswith('J'):\n",
    "                pos = wordnet.ADJ\n",
    "                lemmas.append(wordnet_lemmatizer.lemmatize(token_tuple[0], pos))\n",
    "            elif pos_tag.startswith('V'):\n",
    "                pos = wordnet.VERB\n",
    "                lemmas.append(wordnet_lemmatizer.lemmatize(token_tuple[0], pos))\n",
    "            elif pos_tag.startswith('R'):\n",
    "                pos = wordnet.ADV\n",
    "                lemmas.append(wordnet_lemmatizer.lemmatize(token_tuple[0], pos))\n",
    "            else:\n",
    "                pos = wordnet.NOUN\n",
    "                lemmas.append(wordnet_lemmatizer.lemmatize(token_tuple[0], pos))\n",
    "    lemma_count = len(set(lemmas))\n",
    "    # print(lemma_count)\n",
    "    return lemma_count"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 92,
   "id": "848c3b71",
   "metadata": {},
   "outputs": [],
   "source": [
    "## 单词还原之后的词汇复杂度 18\n",
    "# 获取单词的词性\n",
    "def get_wordnet_pos(tag):\n",
    "    if tag.startswith('J'):\n",
    "        return wordnet.ADJ\n",
    "    elif tag.startswith('V'):\n",
    "        return wordnet.VERB\n",
    "    elif tag.startswith('N'):\n",
    "        return wordnet.NOUN\n",
    "    elif tag.startswith('R'):\n",
    "        return wordnet.ADV\n",
    "    else:\n",
    "        return None\n",
    "\n",
    "def get_lemma_richness(essay):\n",
    "    tokens = sentence_to_wordlist(essay)  # 分词\n",
    "    tagged_sent = pos_tag(tokens)     # 获取单词词性\n",
    "\n",
    "    wnl = WordNetLemmatizer()\n",
    "    lemmas_sent = []\n",
    "    for tag in tagged_sent:\n",
    "        wordnet_pos = get_wordnet_pos(tag[1]) or wordnet.NOUN\n",
    "        lemmas_sent.append(wnl.lemmatize(tag[0], pos=wordnet_pos)) # 词形还原\n",
    "    return len(set(lemmas_sent))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 93,
   "id": "0f084458",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "78"
      ]
     },
     "execution_count": 93,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "get_lemma_richness(example)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "6a157f1d",
   "metadata": {},
   "source": [
    "### 句法特征"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "id": "1ec5e8f0",
   "metadata": {},
   "outputs": [],
   "source": [
    "## 句子个数 1\n",
    "def sent_count(essay):\n",
    "    sentences = nltk.sent_tokenize(essay)\n",
    "    return len(sentences)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "id": "db603318",
   "metadata": {},
   "outputs": [],
   "source": [
    "## 平均句子长度和方差 2 3\n",
    "import numpy as np \n",
    "def get_avg_sents_var(essay):\n",
    "    sent_len = []\n",
    "    sents = tokenize(essay)\n",
    "    for sent in sents:\n",
    "        sent_len.append(len(sent))\n",
    "    return np.mean(sent_len),np.var(sent_len)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "id": "8a872f0b",
   "metadata": {},
   "outputs": [
    {
     "ename": "NameError",
     "evalue": "name 'example' is not defined",
     "output_type": "error",
     "traceback": [
      "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[1;31mNameError\u001b[0m                                 Traceback (most recent call last)",
      "\u001b[1;32m<ipython-input-19-eda59b76561f>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[0mget_avg_sents_var\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mexample\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m",
      "\u001b[1;31mNameError\u001b[0m: name 'example' is not defined"
     ]
    }
   ],
   "source": [
    "get_avg_sents_var(example)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "id": "5cf53414",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 长度大于5,10,15,25的句子数量 4 5 6 7\n",
    "def dif_len_sents(essay):\n",
    "    tf = 0\n",
    "    of = 0\n",
    "    ten = 0\n",
    "    five = 0\n",
    "    sents = tokenize(essay)\n",
    "    for sent in sents:\n",
    "        if len(sent)>25:\n",
    "            tf+=1\n",
    "        elif len(sent)>15:\n",
    "            of += 1\n",
    "        elif len(sent)>10:\n",
    "            ten += 1\n",
    "        elif len(sent)>5:\n",
    "            five += 1\n",
    "    return tf,of,ten,five"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "id": "49adfc9f",
   "metadata": {},
   "outputs": [
    {
     "ename": "NameError",
     "evalue": "name 'example' is not defined",
     "output_type": "error",
     "traceback": [
      "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[1;31mNameError\u001b[0m                                 Traceback (most recent call last)",
      "\u001b[1;32m<ipython-input-21-764d200cb04f>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[0mdif_len_sents\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mexample\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m",
      "\u001b[1;31mNameError\u001b[0m: name 'example' is not defined"
     ]
    }
   ],
   "source": [
    "dif_len_sents(example)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "id": "81eb2f17",
   "metadata": {},
   "outputs": [],
   "source": [
    "## 句子平均名词、动词 形容词 情态动词 介词 8 9 10 11 12\n",
    "def avg_pos(essay):\n",
    "    tokenized_sentences = tokenize(essay)\n",
    "    sents_count = len(tokenized_sentences)\n",
    "    \n",
    "    noun_count = 0\n",
    "    adj_count = 0\n",
    "    verb_count = 0\n",
    "    emo_count = 0\n",
    "    pre_count = 0\n",
    "    conj_count = 0\n",
    "\n",
    "    for sentence in tokenized_sentences:\n",
    "        tagged_tokens = nltk.pos_tag(sentence)\n",
    "\n",
    "        for token_tuple in tagged_tokens:\n",
    "            pos_tag = token_tuple[1]\n",
    "\n",
    "            if pos_tag.startswith('N'):\n",
    "                noun_count += 1\n",
    "            elif pos_tag.startswith('J'):\n",
    "                adj_count += 1\n",
    "            elif pos_tag.startswith('V'):\n",
    "                verb_count += 1\n",
    "            elif pos_tag.startswith('MD'):\n",
    "                emo_count += 1\n",
    "            elif pos_tag.startswith('IN'):\n",
    "                pre_count +=1\n",
    "\n",
    "    avg_noun = noun_count/sents_count\n",
    "    avg_verb = verb_count/sents_count\n",
    "    avg_adj = adj_count/sents_count \n",
    "    avg_pre = pre_count/sents_count\n",
    "    avg_emo = emo_count/sents_count\n",
    "    \n",
    "    return avg_noun,avg_verb,avg_adj,avg_pre,avg_emo\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "id": "f2b501da",
   "metadata": {},
   "outputs": [
    {
     "ename": "NameError",
     "evalue": "name 'example' is not defined",
     "output_type": "error",
     "traceback": [
      "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[1;31mNameError\u001b[0m                                 Traceback (most recent call last)",
      "\u001b[1;32m<ipython-input-23-7b9efd8979cd>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[0mavg_pos\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mexample\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m",
      "\u001b[1;31mNameError\u001b[0m: name 'example' is not defined"
     ]
    }
   ],
   "source": [
    "avg_pos(example)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "id": "c1237dcf",
   "metadata": {},
   "outputs": [],
   "source": [
    "## 句子平均标点符号 13\n",
    "def avg_signal(essay):\n",
    "    tokenized_sentences = tokenize(essay)\n",
    "    sents_count = len(tokenized_sentences)\n",
    "    signal_count = 0\n",
    "    signals = ['!',',','.','?','-s','-ly','</s>','s']\n",
    "    tokens = nltk.word_tokenize(essay)\n",
    "    for token in tokens:\n",
    "        if token in signals:\n",
    "            signal_count+=1\n",
    "            #print(token)\n",
    "    avg_signal = signal_count/sents_count\n",
    "    return avg_signal"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "39bd30fd",
   "metadata": {},
   "outputs": [
    {
     "ename": "NameError",
     "evalue": "name 'example' is not defined",
     "output_type": "error",
     "traceback": [
      "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[1;31mNameError\u001b[0m                                 Traceback (most recent call last)",
      "\u001b[1;32m<ipython-input-12-d7713fad96c3>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[0mavg_signal\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mexample\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m",
      "\u001b[1;31mNameError\u001b[0m: name 'example' is not defined"
     ]
    }
   ],
   "source": [
    "avg_signal(example)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "id": "55864045",
   "metadata": {},
   "outputs": [],
   "source": [
    "## 句子深度最大值  平均值\n",
    "# SBR 子句平均个数  动词短语vp个数，名词短语nn个数 ADJP形容词短语个数 ADVP副词短语个数 14 15 16 17 18\n",
    "from stanfordcorenlp import StanfordCoreNLP\n",
    "from nltk.tree import Tree\n",
    "from tqdm import tqdm\n",
    "def get_vps(essay): \n",
    "    sbr_count = 0\n",
    "    vp = 0\n",
    "    np = 0\n",
    "    adjp = 0\n",
    "    advp = 0\n",
    "    \n",
    "    try:\n",
    "        tokenized_sentences = tokenize(essay)\n",
    "        sents_count = len(tokenized_sentences)\n",
    "\n",
    "        nlp = StanfordCoreNLP(r'D:\\files\\chrome\\stanford-corenlp-4.2.2\\stanford-corenlp-4.2.2')\n",
    "\n",
    "\n",
    "        for sent in tqdm(essay.split(\".\")):  \n",
    "            #t = nlp.parse(sent)\n",
    "            t = nlp.parse(sent)\n",
    "            if \"SBAR\" in t:\n",
    "                 sbr_count+=1\n",
    "            elif \"VP\" in t:\n",
    "                vp +=1\n",
    "            elif \"NP\" in t:\n",
    "                np+=1 \n",
    "            elif \"ADJP\" in t:\n",
    "                adjp +=1 \n",
    "            elif \"ADVP\" in t:\n",
    "                advp+=1\n",
    "            print(\"success\")\n",
    "    except Exception as e:\n",
    "            print(e)\n",
    "            print(\"failed\")\n",
    "            pass\n",
    "            \n",
    "    avg_sbr = sbr_count/sents_count\n",
    "    avg_vp = vp/sents_count\n",
    "    avg_np = np/sents_count\n",
    "    avg_adjp = adjp/sents_count\n",
    "    avg_advp = advp/sents_count\n",
    "    \n",
    "    return avg_sbr,avg_vp,avg_np,avg_adjp,avg_advp\n",
    "    #print ('Constituency Parsing:', nlp.parse(sent))#语法树\n",
    "    \n",
    "    #print(\"-----------------------\")\n",
    "\n",
    "    nlp.close()#释放，否则后端服务器将消耗大量内存"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "603d5447",
   "metadata": {},
   "outputs": [],
   "source": [
    "get_vps(example)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "3d976661",
   "metadata": {},
   "source": [
    "### 语法正确性特征"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "cef43f35",
   "metadata": {},
   "outputs": [],
   "source": [
    "## 这个我就先用语法检查接口吧 1\n",
    "import language_tool_python\n",
    "def grammer_error(essay):\n",
    "    try:\n",
    "        tool = language_tool_python.LanguageTool('en-US') \n",
    "        matches = tool.check(essay)\n",
    "        length = len(matches)\n",
    "        print(yes)\n",
    "    except Exception as e:\n",
    "        print(e)\n",
    "        length = 0\n",
    "        \n",
    "    return length"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "642a9a45",
   "metadata": {},
   "outputs": [
    {
     "ename": "NameError",
     "evalue": "name 'example' is not defined",
     "output_type": "error",
     "traceback": [
      "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[1;31mNameError\u001b[0m                                 Traceback (most recent call last)",
      "\u001b[1;32m<ipython-input-8-32683e7786f4>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[0mgrammer_error\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mexample\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m",
      "\u001b[1;31mNameError\u001b[0m: name 'example' is not defined"
     ]
    }
   ],
   "source": [
    "grammer_error(example)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "43a08655",
   "metadata": {},
   "source": [
    "### 语义特征"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "003f7756",
   "metadata": {},
   "source": [
    "####  1. 读取word2vector特征(加和词向量)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "cba9639c",
   "metadata": {},
   "outputs": [],
   "source": [
    "txt1 = \"\"\"\n",
    "Dear Jerry I'm gale that you can get an English leature for high school Gread one I know you have many diffict need to solve. I'll try my best to help you. I belive that you can do well. you also should try your best to do. You say that have many don't know thing. These thing are so easy. You don't worry about more this. Firstly. you should read the leature again and again. to know about comply. This is a bab. Sencondly. you should have active bodly baod to let your leature become interesting and active and acttilt. I belive you can do well Fillaly you need to say that Thanks you come there listen to my leature. then come back friendly. These thing I belive that you can do well. look farward to you Yours, Li Hua\n",
    "\n",
    "\"\"\""
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "5213c3e3",
   "metadata": {},
   "outputs": [],
   "source": [
    "#加载原来已经处理好的词汇向量文件，这个里面只保留了我们的文章里有的词汇\n",
    "import pickle\n",
    "with open(\"glove_abb2word.6B.100d.pkl\", \"rb\") as fp:   #Pickling\n",
    "    w_v_dict = pickle.load(fp) "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "e433f747",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 输入文章，得出文章矩阵，如果文章中的词汇在这里，那么就返回词汇向量，如果没有就不返回了\n",
    "def get_glove_100_vec(essay,w_v_dict):\n",
    "    essay = essay.lower()\n",
    "    essay_list = essay.split()     # 将句子(英文)通过空格分割成由单词组成的list\n",
    "    essay_vec = []    # 存储向量的矩阵\n",
    "    for e in essay_list:     # 遍历所有单词，返回每个单词的向量\n",
    "        #e = word_del_punctuation(e)   # str处理，去除标点符号\n",
    "        if e in w_v_dict:\n",
    "            vector = [float(num) for num in w_v_dict[e]]\n",
    "            essay_vec.append(vector)\n",
    "        #else:\n",
    "            #vector = np.zeros((1,100))\n",
    "            #essay_vec.append(vector)\n",
    "            #print(type(w_v_dict[e]))\n",
    "    essay_vec = pd.DataFrame(essay_vec)  # 转成DataFrame格式，方便求句子的向量平均值\n",
    "    if len(essay_list) > 0:\n",
    "        return (essay_vec.sum() / len(essay_list)).tolist() # 这是一个essay地向量，总共有100维\n",
    "    else:\n",
    "        print('Error')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "f069b8f9",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "已处理1002篇\n"
     ]
    }
   ],
   "source": [
    "#把essays转换为向量形式\n",
    "vectors_glove = []\n",
    "count = 1\n",
    "for essay in data['corrected']:\n",
    "    vectors_glove.append(get_glove_100_vec(essay,w_v_dict))\n",
    "    count+=1\n",
    "print(\"已处理{}篇\".format(count))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "7021216d",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>0</th>\n",
       "      <th>1</th>\n",
       "      <th>2</th>\n",
       "      <th>3</th>\n",
       "      <th>4</th>\n",
       "      <th>5</th>\n",
       "      <th>6</th>\n",
       "      <th>7</th>\n",
       "      <th>8</th>\n",
       "      <th>9</th>\n",
       "      <th>...</th>\n",
       "      <th>89</th>\n",
       "      <th>90</th>\n",
       "      <th>91</th>\n",
       "      <th>92</th>\n",
       "      <th>93</th>\n",
       "      <th>94</th>\n",
       "      <th>95</th>\n",
       "      <th>96</th>\n",
       "      <th>97</th>\n",
       "      <th>98</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>-0.122595</td>\n",
       "      <td>0.165500</td>\n",
       "      <td>0.315609</td>\n",
       "      <td>-0.206176</td>\n",
       "      <td>-0.160804</td>\n",
       "      <td>0.155650</td>\n",
       "      <td>-0.219391</td>\n",
       "      <td>0.172437</td>\n",
       "      <td>-0.030512</td>\n",
       "      <td>-0.092974</td>\n",
       "      <td>...</td>\n",
       "      <td>-0.283699</td>\n",
       "      <td>-0.062132</td>\n",
       "      <td>-0.101791</td>\n",
       "      <td>0.012735</td>\n",
       "      <td>-0.021434</td>\n",
       "      <td>-0.426891</td>\n",
       "      <td>-0.042471</td>\n",
       "      <td>-0.178684</td>\n",
       "      <td>-0.329797</td>\n",
       "      <td>0.349662</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>-0.106687</td>\n",
       "      <td>0.201334</td>\n",
       "      <td>0.379824</td>\n",
       "      <td>-0.210815</td>\n",
       "      <td>-0.132841</td>\n",
       "      <td>0.222382</td>\n",
       "      <td>-0.226976</td>\n",
       "      <td>0.131443</td>\n",
       "      <td>-0.107186</td>\n",
       "      <td>-0.039252</td>\n",
       "      <td>...</td>\n",
       "      <td>-0.275913</td>\n",
       "      <td>-0.054048</td>\n",
       "      <td>-0.115074</td>\n",
       "      <td>-0.016098</td>\n",
       "      <td>-0.018940</td>\n",
       "      <td>-0.434590</td>\n",
       "      <td>-0.117005</td>\n",
       "      <td>-0.102704</td>\n",
       "      <td>-0.297507</td>\n",
       "      <td>0.416137</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>-0.166393</td>\n",
       "      <td>0.232186</td>\n",
       "      <td>0.395117</td>\n",
       "      <td>-0.248566</td>\n",
       "      <td>-0.213169</td>\n",
       "      <td>0.203799</td>\n",
       "      <td>-0.195061</td>\n",
       "      <td>0.187165</td>\n",
       "      <td>-0.022237</td>\n",
       "      <td>-0.110814</td>\n",
       "      <td>...</td>\n",
       "      <td>-0.300947</td>\n",
       "      <td>-0.105389</td>\n",
       "      <td>-0.034921</td>\n",
       "      <td>0.031134</td>\n",
       "      <td>0.019497</td>\n",
       "      <td>-0.441293</td>\n",
       "      <td>-0.059243</td>\n",
       "      <td>-0.096287</td>\n",
       "      <td>-0.331291</td>\n",
       "      <td>0.377574</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>-0.133434</td>\n",
       "      <td>0.208980</td>\n",
       "      <td>0.331405</td>\n",
       "      <td>-0.257313</td>\n",
       "      <td>-0.140952</td>\n",
       "      <td>0.224525</td>\n",
       "      <td>-0.185157</td>\n",
       "      <td>0.184754</td>\n",
       "      <td>-0.033901</td>\n",
       "      <td>-0.111800</td>\n",
       "      <td>...</td>\n",
       "      <td>-0.262447</td>\n",
       "      <td>-0.086778</td>\n",
       "      <td>-0.083978</td>\n",
       "      <td>0.044160</td>\n",
       "      <td>-0.031375</td>\n",
       "      <td>-0.437912</td>\n",
       "      <td>-0.063151</td>\n",
       "      <td>-0.062102</td>\n",
       "      <td>-0.294756</td>\n",
       "      <td>0.378867</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>-0.165830</td>\n",
       "      <td>0.225593</td>\n",
       "      <td>0.337170</td>\n",
       "      <td>-0.236448</td>\n",
       "      <td>-0.112774</td>\n",
       "      <td>0.212644</td>\n",
       "      <td>-0.207439</td>\n",
       "      <td>0.162187</td>\n",
       "      <td>-0.025724</td>\n",
       "      <td>-0.052301</td>\n",
       "      <td>...</td>\n",
       "      <td>-0.260805</td>\n",
       "      <td>-0.058374</td>\n",
       "      <td>-0.062153</td>\n",
       "      <td>-0.022411</td>\n",
       "      <td>-0.015859</td>\n",
       "      <td>-0.436348</td>\n",
       "      <td>-0.080576</td>\n",
       "      <td>-0.173956</td>\n",
       "      <td>-0.359677</td>\n",
       "      <td>0.434674</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>5 rows × 99 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "         0         1         2         3         4         5         6   \\\n",
       "0 -0.122595  0.165500  0.315609 -0.206176 -0.160804  0.155650 -0.219391   \n",
       "1 -0.106687  0.201334  0.379824 -0.210815 -0.132841  0.222382 -0.226976   \n",
       "2 -0.166393  0.232186  0.395117 -0.248566 -0.213169  0.203799 -0.195061   \n",
       "3 -0.133434  0.208980  0.331405 -0.257313 -0.140952  0.224525 -0.185157   \n",
       "4 -0.165830  0.225593  0.337170 -0.236448 -0.112774  0.212644 -0.207439   \n",
       "\n",
       "         7         8         9   ...        89        90        91        92  \\\n",
       "0  0.172437 -0.030512 -0.092974  ... -0.283699 -0.062132 -0.101791  0.012735   \n",
       "1  0.131443 -0.107186 -0.039252  ... -0.275913 -0.054048 -0.115074 -0.016098   \n",
       "2  0.187165 -0.022237 -0.110814  ... -0.300947 -0.105389 -0.034921  0.031134   \n",
       "3  0.184754 -0.033901 -0.111800  ... -0.262447 -0.086778 -0.083978  0.044160   \n",
       "4  0.162187 -0.025724 -0.052301  ... -0.260805 -0.058374 -0.062153 -0.022411   \n",
       "\n",
       "         93        94        95        96        97        98  \n",
       "0 -0.021434 -0.426891 -0.042471 -0.178684 -0.329797  0.349662  \n",
       "1 -0.018940 -0.434590 -0.117005 -0.102704 -0.297507  0.416137  \n",
       "2  0.019497 -0.441293 -0.059243 -0.096287 -0.331291  0.377574  \n",
       "3 -0.031375 -0.437912 -0.063151 -0.062102 -0.294756  0.378867  \n",
       "4 -0.015859 -0.436348 -0.080576 -0.173956 -0.359677  0.434674  \n",
       "\n",
       "[5 rows x 99 columns]"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 把列表转换成数据框格式\n",
    "word2vec = pd.DataFrame(vectors_glove)\n",
    "word2vec.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "78cab173",
   "metadata": {},
   "source": [
    "#### 2. 探索聚类-单词主题分布\n",
    "遍历每个essay中的每个单词，取出词向量，然后把所有的词向量append在一起全部输入k-menas中做聚类算法，分成30个类别，然后遍历文章中的单词，看属于各个类别的词汇各有多少个"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "id": "56150bf2",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 拼接所有essay 所有单词的词向量\n",
    "word_arr = []\n",
    "for essay in data[\"corrected\"]:\n",
    "    tokens = nltk.word_tokenize(essay) # 分词 包括标点符号\n",
    "    for token in tokens: #遍历词汇\n",
    "        token = token.lower()\n",
    "        if token in w_v_dict: \n",
    "            word_vector = [float(num) for num in w_v_dict[token]] #取词向量\n",
    "            #print(word_vector)\n",
    "            word_arr.append(word_vector)#把词向量加入数组\n",
    "\n",
    "            # 把list转换为arr\n",
    "array = np.array(word_arr, dtype = float)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "1e647030",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(111321, 99)"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#也就是说 总共111321个词汇，然后每个词汇有99个维度\n",
    "array.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "id": "d94bbcfd",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[8 8 9 ... 8 7 7]\n",
      "[[-3.63135359e-01  6.59909535e-01  8.00311897e-01 -7.31445278e-01\n",
      "  -7.37950888e-01  5.16410336e-01 -3.94123478e-01  2.95855291e-01\n",
      "   3.44820912e-01 -4.18438875e-01  5.21143434e-01  9.67521192e-02\n",
      "   2.21415464e-01  1.42733562e-01  1.46782083e-01 -2.50115255e-01\n",
      "  -3.92339458e-02  7.14713206e-01 -7.41409549e-01  8.49612422e-01\n",
      "   5.13095853e-02  3.27359861e-01 -3.17937427e-01 -6.57600391e-01\n",
      "   2.16272531e-01  5.22532702e-01 -4.55578270e-01 -9.51972273e-01\n",
      "   5.88924020e-01 -6.53532986e-01 -5.14996175e-02  9.91510767e-01\n",
      "   3.38531406e-01 -2.71705432e-03  1.84359803e-01  4.61031977e-01\n",
      "  -3.68051054e-01  1.50750204e-01  6.90221481e-01 -7.25248569e-01\n",
      "  -1.02283433e-01 -1.46135875e-01 -2.75692057e-01 -9.28079578e-01\n",
      "  -8.57487145e-01  6.65723630e-02 -1.53149016e-02 -5.47403393e-01\n",
      "  -2.42572790e-01 -1.39600597e+00  4.19432167e-02  3.04473051e-02\n",
      "  -3.24970561e-02  9.85306840e-01 -1.62285985e-01 -2.48971480e+00\n",
      "   3.69448020e-01  3.90574430e-01  1.77320251e+00  4.38516028e-01\n",
      "  -6.78567174e-02  1.35486909e+00 -7.58307245e-01 -2.61858269e-01\n",
      "   1.05375960e+00  2.88683514e-01  1.08233277e+00  5.13564766e-01\n",
      "  -2.34875109e-01 -3.82109475e-01  1.62957601e-01 -2.55572890e-01\n",
      "   1.11499780e-01 -5.85742420e-01  1.39606943e-01  1.99859524e-01\n",
      "   8.46328167e-02 -1.80335076e-01 -1.37197006e-01 -1.31335928e-01\n",
      "   5.00501117e-01 -2.91373511e-01 -9.80459817e-01 -4.77447006e-02\n",
      "  -1.79281714e+00 -2.16543897e-01 -2.06685682e-02 -2.18314064e-01\n",
      "  -4.54723288e-01 -3.84674081e-01 -2.43718662e-01 -6.82176748e-02\n",
      "   3.94448166e-01 -4.74849151e-01 -5.69716091e-01 -2.43164771e-01\n",
      "   8.88696296e-02 -3.80956170e-01  3.26448398e-01]\n",
      " [-1.96500227e-01  3.53597980e-01  3.28591682e-01 -2.63645919e-01\n",
      "  -2.13605067e-01 -6.00606017e-02 -3.08855683e-01  2.58462207e-01\n",
      "   5.05271904e-03 -2.22523620e-01 -9.71167240e-02  1.05707787e-01\n",
      "   3.03166903e-01  2.00164887e-02 -9.41725699e-02 -3.52924686e-01\n",
      "   2.09545633e-01  4.41303540e-01 -6.01361390e-01  3.23603318e-01\n",
      "   7.64022169e-02 -1.41483297e-01  3.84771529e-03 -6.89700174e-02\n",
      "  -6.79122635e-02  1.11029904e-02 -1.56214634e-01 -4.85398321e-01\n",
      "   2.23150232e-01 -3.28333526e-01 -2.08419541e-01  6.76077268e-01\n",
      "  -1.60842320e-01  3.54998613e-02  3.43982071e-01  3.41830660e-01\n",
      "  -1.61222450e-02  1.63647006e-01 -9.75335066e-02 -2.43153998e-01\n",
      "  -3.75794561e-01 -3.02389003e-01  2.00864516e-03 -6.26921406e-01\n",
      "  -3.04781766e-01 -6.68783505e-02  6.90575972e-02 -3.08368121e-01\n",
      "  -7.99526595e-02 -1.04929825e+00  1.91861471e-01 -1.52712770e-01\n",
      "  -7.27342421e-02  1.07846918e+00  9.73181428e-02 -2.21700129e+00\n",
      "   6.27833420e-02 -1.34466638e-01  1.63815786e+00  3.00836994e-01\n",
      "  -1.98683051e-01  7.26931296e-01 -4.67235874e-01 -8.70744316e-02\n",
      "   8.97962708e-01  1.88944012e-01  2.95174323e-01  5.25107414e-01\n",
      "  -1.16478994e-01 -6.31058756e-01  2.11325791e-01 -4.72740114e-01\n",
      "  -2.66070347e-02 -5.18535465e-01  2.70746150e-01 -2.48187845e-02\n",
      "  -2.68601117e-01 -4.34648842e-02 -5.56155390e-01 -5.10826516e-02\n",
      "   6.07976762e-01 -1.01211007e-01 -6.30077503e-01 -1.20968231e-01\n",
      "  -1.57367436e+00 -1.67421143e-01  2.84840218e-01  1.34086210e-01\n",
      "  -1.77968631e-01 -3.72580739e-01 -2.29180925e-01 -1.38965519e-01\n",
      "  -4.84511483e-02 -3.42296116e-01 -5.04450988e-01  1.64946497e-02\n",
      "   1.00087184e-01 -4.91624194e-01  5.00520452e-01]\n",
      " [ 1.32209501e-01  5.07176267e-01 -2.26756759e-02  1.65502011e-01\n",
      "  -1.79687137e-01  8.63447872e-01 -1.34999414e-01 -1.60504483e-01\n",
      "  -1.07579255e-01  4.70661766e-01 -3.48398185e-01 -3.51270458e-01\n",
      "   1.62833394e-01  3.78341696e-01 -1.99805082e-01 -2.80280706e-01\n",
      "   2.14618409e-01 -2.59478836e-01 -5.40932531e-01  2.77201841e-01\n",
      "  -2.35369337e-01 -1.29263975e-01  4.27487053e-01 -3.46781062e-01\n",
      "   7.81891971e-03 -7.99787503e-01 -8.21132348e-02 -4.51004490e-01\n",
      "   6.32032917e-02  2.75851094e-01 -6.57660402e-01  7.56841974e-01\n",
      "  -2.92480736e-01 -3.50936976e-01  1.90258860e-01  1.53226487e-01\n",
      "  -3.80362089e-01  2.79653190e-01 -1.47932865e-01  1.78868569e-01\n",
      "  -8.89143695e-01 -5.37413279e-03 -4.18577603e-01  3.70988393e-02\n",
      "   4.60290711e-02 -1.73112049e-01  2.12126074e-01 -2.59584179e-01\n",
      "  -4.83523407e-03 -2.88972709e-01 -1.28422120e-02 -1.62317069e-01\n",
      "   2.81188697e-01  4.74279407e-01 -3.06566879e-01 -1.72109902e+00\n",
      "  -1.79338981e-01 -4.12091848e-01  1.26812690e+00  1.73380743e-01\n",
      "   1.47213006e-01  7.52798413e-01 -3.68826589e-01 -7.09898724e-01\n",
      "   4.00363116e-01 -7.25486038e-02  4.59609696e-01  3.27495288e-01\n",
      "   3.25818902e-01  8.86777361e-02 -3.24923720e-01  3.65418261e-01\n",
      "   4.08195769e-01 -5.72891225e-01 -7.28508755e-02  6.00483122e-01\n",
      "  -1.06521852e-01  2.88537823e-01 -4.96040026e-01 -7.99399246e-01\n",
      "   1.03156393e-01 -6.02885371e-01 -2.90467004e-01 -5.07777747e-01\n",
      "  -1.51670789e+00 -6.44137165e-02 -2.15590587e-01 -5.80533726e-01\n",
      "   2.34259261e-01 -1.41853065e-02 -1.25996518e-01 -1.27828854e-01\n",
      "   9.01477591e-02  4.15440434e-01 -6.78598015e-01  1.17289783e-01\n",
      "  -4.41961964e-01 -3.16951190e-01  2.89599032e-01]\n",
      " [-5.04731703e-02  5.17014312e-02  3.58442080e-01 -2.15492311e-01\n",
      "   1.63606367e-01  1.81533230e-01 -7.89865037e-02  2.40941797e-01\n",
      "  -4.18298933e-01  8.65374644e-02  1.83136818e-01 -1.88776907e-01\n",
      "   2.62580743e-01  1.11002978e-01  1.47936433e-01 -2.25984834e-01\n",
      "   2.84644366e-01 -8.41320440e-02 -3.61169243e-01  2.01695604e-02\n",
      "   2.43448497e-01 -1.35021250e-01  3.63750893e-01  1.89541550e-01\n",
      "   4.01633530e-01 -1.62374391e-01 -1.01136991e-01 -4.74404585e-01\n",
      "   4.50483128e-02 -6.79830811e-02 -1.74686486e-01  3.84829314e-01\n",
      "  -8.04574401e-02  8.58369107e-02 -1.11019470e-01  1.79691672e-01\n",
      "   1.40708631e-02  4.35031510e-01 -1.44832456e-01 -8.33092218e-02\n",
      "  -5.07936295e-01 -3.47128744e-01  2.01479927e-01 -2.28199983e-01\n",
      "   7.21127700e-02  1.64959529e-01  2.48490952e-01 -4.67952896e-01\n",
      "  -1.98977050e-02 -6.56710712e-01 -1.06067323e-01 -2.37655850e-02\n",
      "   1.72237004e-01  1.25013520e+00 -3.84802402e-01 -2.73042996e+00\n",
      "  -1.84568765e-01 -2.81276377e-01  1.69556552e+00  6.56956650e-01\n",
      "  -2.43886467e-01  7.39784447e-01 -9.48052794e-02  3.27693629e-01\n",
      "   7.15342447e-01 -1.43661309e-01  3.76718922e-01  2.68724985e-01\n",
      "   2.65490248e-01 -9.11166435e-02 -4.74991631e-02 -2.50709711e-01\n",
      "  -1.75319072e-01 -3.53350135e-01  1.59874751e-01  1.42910960e-01\n",
      "  -2.88600978e-01 -4.75516721e-02 -9.69347618e-01 -9.87524041e-02\n",
      "   6.90140586e-01  2.36635110e-01 -3.98373092e-01  2.62777776e-01\n",
      "  -1.33011019e+00 -2.31622322e-01  2.34880215e-02 -1.60238635e-01\n",
      "   2.24616322e-03 -3.60337835e-01 -3.07644666e-02 -1.47418181e-01\n",
      "  -2.06458849e-01  4.51656527e-01 -6.48805400e-01  3.19871257e-03\n",
      "  -2.81516158e-01 -2.00866569e-01  6.92820329e-01]\n",
      " [-9.98023502e-02 -1.11112123e-01  2.15056453e-01  2.92057457e-01\n",
      "   3.93481135e-01  5.65273170e-01  1.27087110e-01 -1.41848155e-01\n",
      "  -4.97047416e-01 -1.53748785e-01 -6.48957245e-01 -4.86255080e-01\n",
      "  -6.19750538e-01 -4.04193873e-02  3.67220768e-02  3.88693934e-01\n",
      "  -1.12833698e-01 -1.22107785e-01 -4.17645890e-01 -9.24479956e-01\n",
      "  -7.43591405e-02 -8.31280953e-01  2.84592209e-02 -2.78751018e-01\n",
      "   1.92845606e-01 -1.62353753e-02 -5.59792963e-01  6.46846676e-01\n",
      "   3.72747553e-01  2.52035545e-01  8.42911138e-02  8.01748643e-01\n",
      "   4.79735161e-01  2.81761644e-01 -6.33072677e-01  4.33437149e-01\n",
      "  -2.52613822e-01  3.81864191e-01 -6.55937586e-01  3.12902673e-01\n",
      "  -8.08296899e-01 -5.63167331e-01  4.90954685e-01  5.26817260e-01\n",
      "  -3.15887797e-01 -7.00682803e-01  4.39495576e-01 -3.83635702e-01\n",
      "  -5.33445773e-01 -7.73629899e-01  4.26463253e-01 -2.88577783e-01\n",
      "   1.01506626e+00  2.66016049e-01 -1.21857775e-01 -1.75788660e+00\n",
      "   6.19659380e-02 -1.46877310e-01  1.37860544e+00  7.64968814e-03\n",
      "  -2.04894976e-01  6.06212818e-01 -6.28370048e-03 -1.16216287e+00\n",
      "  -6.20050456e-02 -1.31890881e-01  6.04412473e-01  2.79536345e-01\n",
      "   1.28130132e-01 -3.58735562e-01 -6.22043633e-02  1.21414833e-01\n",
      "   2.85507753e-01 -6.29519483e-01 -2.97743613e-01  5.96712940e-01\n",
      "   1.46888413e-01  3.71262619e-01 -6.30699507e-01 -4.24570714e-01\n",
      "   8.62664846e-02 -9.67099062e-01 -7.80766477e-02 -4.26328867e-01\n",
      "  -1.82677059e+00  2.44716347e-01 -3.96085504e-03  7.46492642e-02\n",
      "   4.12188260e-01 -5.17328307e-01  4.66829321e-01 -6.37095744e-01\n",
      "   2.60401701e-01  7.71492693e-01 -1.09667554e-01  7.39367180e-02\n",
      "   2.28777516e-01 -3.09351542e-01  5.26672139e-01]\n",
      " [-1.94408755e-01  9.67342303e-02  1.70665681e-01 -7.22069093e-02\n",
      "  -6.06685869e-02  1.66976332e-01 -5.51436002e-01  4.39070999e-02\n",
      "  -1.54159870e-01  2.95114006e-01 -8.49905476e-02  8.51332323e-02\n",
      "  -1.21217161e-01 -2.69450814e-01  1.25426888e-01 -4.05505221e-01\n",
      "   9.02304740e-01  8.58616538e-02 -1.06498544e+00  4.36191074e-01\n",
      "   4.02037667e-01 -5.24656735e-01  4.22915802e-01  3.53114419e-01\n",
      "  -3.39672914e-02 -3.01791519e-01 -1.62016022e-01 -7.70903491e-01\n",
      "   9.40718875e-01 -2.26726910e-01 -4.60937975e-01  5.68973940e-01\n",
      "  -2.02044377e-01  3.64816888e-01 -4.52244491e-01  9.64454213e-01\n",
      "   2.67022717e-01  1.27740246e-01 -9.26088893e-03 -7.89412170e-02\n",
      "  -7.41973655e-01 -3.17698141e-01 -5.56947186e-01 -1.07597960e+00\n",
      "  -4.31844093e-01  4.59795450e-01  4.82517758e-02 -4.77309155e-01\n",
      "  -1.43355603e-01 -1.10743797e+00 -3.51743491e-01  1.60683991e-01\n",
      "   4.97834540e-01  1.49665288e+00  8.38671544e-02 -2.90841086e+00\n",
      "  -2.33829166e-01 -9.26766635e-01  2.15462440e+00  2.67874046e-01\n",
      "  -3.45282223e-01  5.07350887e-01 -3.89472602e-01  3.35404142e-01\n",
      "   7.15075332e-01  1.30613669e-01  2.33328238e-01  9.00910862e-01\n",
      "   8.37736900e-03 -8.44110138e-01 -4.04006021e-02 -8.95183395e-01\n",
      "  -3.68579292e-01 -1.01750895e+00  1.46991239e-02 -1.40120877e-01\n",
      "  -4.47684414e-01  2.34968631e-01 -8.19401292e-01  7.09791524e-02\n",
      "   6.35617996e-01  3.24509099e-01 -6.69677895e-01  9.91404679e-02\n",
      "  -1.58567986e+00 -1.50735059e-01  6.70163688e-01  5.52771579e-01\n",
      "  -1.74453950e-01 -1.81842687e-01 -1.19189193e-01  4.41641347e-02\n",
      "  -2.55772553e-01 -6.61131812e-01 -6.13986975e-01 -3.94989349e-01\n",
      "  -2.00085702e-02 -3.67879359e-01  4.42522683e-01]\n",
      " [-4.71692589e-01  2.61902523e-02  8.42326682e-01 -5.65300008e-01\n",
      "  -6.65257031e-01  6.42473171e-01 -7.46496292e-01  2.45907644e-01\n",
      "  -3.05808364e-02  2.34317375e-01  3.61742570e-01  2.24024588e-01\n",
      "   3.17897471e-01  2.27744363e-01 -1.29405987e-01 -3.83805495e-01\n",
      "  -1.45649501e-01  5.14379288e-01 -8.49588191e-02  4.06731078e-01\n",
      "  -6.01902722e-01 -3.54979604e-02 -3.45928583e-01 -2.43446275e-01\n",
      "   3.97018746e-01  9.16319065e-01 -7.17007130e-01 -1.03851420e+00\n",
      "   6.33421996e-01 -4.15856506e-01  7.68319453e-01  1.19967303e+00\n",
      "   5.39324239e-01  5.99581006e-02 -3.48348540e-01  4.11758694e-01\n",
      "  -6.50831212e-01  7.77823971e-02  5.84376389e-01 -7.10535025e-01\n",
      "   4.90374797e-01 -3.32802020e-01  3.35751756e-01 -7.53495190e-01\n",
      "  -7.37261117e-01  1.30645717e-01 -8.29548617e-01 -3.25854106e-01\n",
      "  -1.09870005e-02 -1.38529615e+00  1.76966989e-01  2.51575492e-01\n",
      "  -1.41447845e-01  8.97458725e-01 -9.74013447e-02 -2.33863950e+00\n",
      "   8.46148310e-01  3.16675416e-01  2.30992666e+00 -1.59575869e-01\n",
      "   5.65435220e-01  1.65613249e+00 -3.38487018e-01 -3.10972338e-02\n",
      "   9.12716649e-01  5.41142356e-01  6.10852628e-01 -1.88450687e-01\n",
      "   3.18908076e-01 -5.18619016e-01  1.34145783e-01  4.99893970e-01\n",
      "   5.88020118e-01 -9.71361677e-01  5.80211748e-01  4.94822897e-01\n",
      "  -2.85610168e-01 -4.68553059e-01 -4.51192290e-01  1.68088242e-01\n",
      "   4.00559261e-01  5.30843780e-01 -3.38205555e-01 -1.38156495e-01\n",
      "  -1.63260355e+00 -2.32639250e-01 -1.69820948e-01 -1.61077886e-01\n",
      "  -2.04817603e-01 -5.62646185e-02 -5.93407856e-01  7.79570052e-01\n",
      "   1.21919044e+00  1.10529945e-01 -5.44793310e-01 -5.42341138e-01\n",
      "   1.62233065e-01 -3.53549640e-01  8.36906220e-01]\n",
      " [ 4.58934858e-02 -8.09281063e-01 -1.74679402e-01  4.97248683e-01\n",
      "   5.47198846e-01  2.20448871e-01 -2.53189993e-02 -1.18663753e-02\n",
      "   8.09735868e-01 -8.29888156e-03  6.74982433e-02  7.48178573e-01\n",
      "   3.99917997e-01 -2.07996617e-01 -4.29733710e-01 -6.45103374e-01\n",
      "   5.66040933e-01 -1.70871279e-01 -7.49736101e-01 -4.96048584e-01\n",
      "   4.59761475e-01  7.94481271e-03 -7.68388902e-01  9.07680154e-01\n",
      "  -6.06425909e-01  5.11358122e-01 -1.24215156e-02  9.77348955e-02\n",
      "  -4.20224313e-01 -6.27999109e-02 -1.14769564e+00  4.67300985e-01\n",
      "   6.56431505e-01 -5.68346196e-02 -3.42973348e-01  9.58495701e-03\n",
      "   3.25737294e-01  7.30950539e-01 -6.06143497e-01 -3.44429156e-01\n",
      "  -8.02950672e-01 -3.92501433e-01  3.86882201e-01 -3.05594910e-01\n",
      "   4.74442199e-01  7.89692412e-02 -5.48405221e-01 -8.69455079e-03\n",
      "   1.70691425e-01 -5.18864994e-01 -4.33795157e-01 -4.80421603e-01\n",
      "   4.73303476e-01  4.05057721e-01  3.27110568e-01 -5.92415307e-01\n",
      "  -5.07016997e-02  4.96721714e-01  1.03651171e-01  2.00560748e-01\n",
      "  -3.19212407e-01 -1.39737708e-01 -2.44183521e-01  7.88204119e-01\n",
      "  -7.08313861e-01 -4.55193683e-02 -3.70720982e-02  1.04192558e+00\n",
      "   2.67286388e-01  4.29759106e-01 -7.81322407e-02  6.49329705e-02\n",
      "   4.09198713e-01 -2.76018459e-01 -1.13681668e-01  4.43824857e-01\n",
      "  -2.94194121e-01 -2.84167396e-01 -4.13740398e-01 -6.72122265e-01\n",
      "   8.51363703e-01 -1.41779106e-01 -4.02479713e-01 -4.89542819e-01\n",
      "  -7.03112251e-01  4.66793649e-01 -1.08900162e+00 -8.00960170e-02\n",
      "   7.65666945e-01 -4.62251303e-01  1.03316842e+00  1.74775305e-01\n",
      "   7.97860202e-01  4.14833489e-01 -4.77244908e-02 -2.49713272e-01\n",
      "  -5.09528906e-01 -1.43658960e+00  5.73615657e-02]\n",
      " [-1.05945094e-01  1.51306123e-01  3.22018559e-01 -2.36121564e-01\n",
      "  -3.10738864e-01  3.30860801e-01 -2.01667249e-01  7.75023168e-02\n",
      "   7.06485014e-02 -3.67681400e-01  2.10294545e-01  7.49202644e-02\n",
      "   2.22313158e-01 -9.63503232e-02 -6.82175956e-02 -3.55172545e-01\n",
      "  -2.32820712e-01  9.44549685e-02 -2.25029171e-01  3.71430107e-01\n",
      "   2.87297653e-02  1.96949113e-01 -3.09527419e-01 -3.52265125e-01\n",
      "   1.32594009e-01  2.84871026e-01 -9.17197056e-02 -1.33111859e-01\n",
      "   3.67266918e-01  2.67200502e-02 -7.64423917e-02  4.88865499e-01\n",
      "   2.98827478e-01  7.90784179e-03  2.24016658e-02  2.18018344e-01\n",
      "  -1.43223181e-01 -6.48141149e-03  1.78271376e-01 -4.27992405e-01\n",
      "  -5.22101246e-02 -2.60458488e-03  1.40132044e-01 -3.09108009e-01\n",
      "  -3.82724442e-01 -1.47816792e-01  3.40360865e-02 -1.07575092e-01\n",
      "  -7.43102030e-02 -7.20749935e-01  9.05913796e-02 -8.62243884e-02\n",
      "   2.14944326e-01  3.36109150e-01 -1.63541894e-01 -9.96330494e-01\n",
      "   2.24861881e-01  1.71249620e-01  4.70959844e-01 -1.25282651e-01\n",
      "   6.44494093e-02  5.80164731e-01 -4.31257697e-01 -2.84392713e-01\n",
      "   3.65594941e-01 -7.88294823e-02  3.20231700e-01  3.27863877e-01\n",
      "  -8.05438745e-02 -2.29139708e-01  4.48007971e-02  5.00962698e-03\n",
      "   1.34826686e-01 -3.89194065e-01  1.08108636e-01  4.15832971e-01\n",
      "   1.11360454e-01 -6.12846599e-02 -2.78499085e-01 -2.13906048e-01\n",
      "   2.91722439e-02 -1.27288583e-01 -1.87393664e-01 -2.29707810e-02\n",
      "  -8.63970423e-01 -6.36066383e-02 -1.45285871e-01  2.18909497e-02\n",
      "  -4.13243748e-01 -2.61206860e-01  2.43829821e-02  1.09256935e-01\n",
      "   2.56566369e-01  4.17169328e-02 -2.37474169e-01  5.76269152e-02\n",
      "  -1.62834708e-01 -1.83224246e-01 -7.05653828e-02]\n",
      " [-2.19622999e-01  4.63139835e-01  5.13406781e-01 -4.13994899e-01\n",
      "  -2.81852293e-01  1.69899656e-01 -1.57459598e-01  2.99333542e-01\n",
      "   1.39670911e-01 -1.47385449e-01  1.08785389e-01  1.77761582e-01\n",
      "   5.46176009e-01 -7.65595583e-02  1.49834369e-01 -4.16572873e-01\n",
      "   4.81399156e-02  2.01474895e-01 -3.89751625e-01  4.42013013e-01\n",
      "   3.99619780e-01 -4.38418598e-02  2.95887281e-01 -7.92107736e-02\n",
      "   1.02116557e-01 -1.30777622e-01 -5.41359262e-02 -5.96717013e-01\n",
      "  -1.40423040e-01 -2.69109230e-01  5.88802196e-02  5.73917081e-01\n",
      "  -1.42007074e-01  8.81781964e-02  2.05703468e-01  3.77595639e-01\n",
      "   8.28409708e-02  2.88318376e-01 -1.64896732e-01 -1.88343144e-01\n",
      "  -5.56715912e-01 -1.78749572e-01  1.97732229e-01 -4.11983285e-01\n",
      "  -1.31879179e-01 -1.45789041e-01  5.43790622e-01 -3.97062971e-01\n",
      "  -1.16332877e-01 -8.19320939e-01  1.39334087e-01 -2.56813105e-01\n",
      "   1.81847196e-01  1.25340507e+00 -3.86123010e-01 -2.62940491e+00\n",
      "   8.39913562e-02 -2.67779204e-01  1.73801126e+00  7.33734421e-01\n",
      "  -1.16596456e-01  1.04805629e+00 -2.48402554e-01  9.32044230e-02\n",
      "   9.91762902e-01 -1.55644629e-02  7.29601449e-01  4.98799610e-01\n",
      "   2.15104678e-01 -3.43916722e-01  9.03991001e-03 -5.56478873e-01\n",
      "  -4.59458894e-02 -3.21629664e-01  2.78864101e-01 -1.02978313e-01\n",
      "  -4.35814929e-02 -2.32439617e-02 -1.18422340e+00  6.54390163e-02\n",
      "   6.90411045e-01 -1.84500452e-01 -7.40617326e-01  1.09198503e-01\n",
      "  -1.72803400e+00 -2.52169777e-01  2.25742069e-01 -1.92602274e-01\n",
      "  -3.36017337e-01 -4.66739892e-01 -1.06723932e-01 -2.03691226e-01\n",
      "  -3.13052810e-01 -1.06396033e-01 -5.83585459e-01 -3.07486349e-02\n",
      "  -3.94955210e-01 -5.36260897e-01  4.88138806e-01]]\n"
     ]
    }
   ],
   "source": [
    "%%time\n",
    "## 词聚类加和 K_means聚类算法，输入词向量集合，输出各个类别包含的单词个数，因此这样就能计算出篇章的语义分布了\n",
    "\n",
    "# 聚类词向量，论文中分了30类，考虑到我的样本集比较小，只分10类\n",
    "from sklearn.cluster import KMeans\n",
    "import numpy as np\n",
    "X = array\n",
    "km = KMeans(n_clusters=10) # 创建KMeans对象，设置簇的数量\n",
    "km.fit(X) # 传入数据\n",
    "labels = km.labels_ # 聚类结果（分类标签）\n",
    "print(labels)\n",
    "centers = km.cluster_centers_ # 簇的中心\n",
    "print(centers)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "id": "9e6a7c16",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 预测函数，输入essay，得到10个类别下的词汇数量\n",
    "def get_themes(essay):\n",
    "    label_count = {\n",
    "        \"0\":0,\n",
    "        \"1\":0,\n",
    "        \"2\":0,\n",
    "        \"3\":0,\n",
    "        \"4\":0,\n",
    "        \"5\":0,\n",
    "        \"6\":0,\n",
    "        \"7\":0,\n",
    "        \"8\":0,\n",
    "        \"9\":0\n",
    "        \n",
    "    }\n",
    "    tokens = nltk.word_tokenize(essay)\n",
    "    for token in tokens: #遍历词汇\n",
    "        token = token.lower()\n",
    "        if token in w_v_dict: \n",
    "            word_vector = [float(num) for num in w_v_dict[token]] #取词向\n",
    "            word_arr = np.array(word_vector,dtype=float).reshape(1,-1)\n",
    "            label_int = km.predict(word_arr)\n",
    "            label = str(label_int.tolist()[0])\n",
    "            label_count[label] = label_count[label]+1\n",
    "            \n",
    "    return list(label_count.values()) # 返回一个数据框类型"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "id": "3ab7fda6",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[27, 18, 3, 20, 0, 9, 4, 2, 14, 24]"
      ]
     },
     "execution_count": 39,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "get_themes(example)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "8f982f80",
   "metadata": {},
   "source": [
    "## 我总共有四种特征\n",
    "- 词法特征，\n",
    "- 句法特征，\n",
    "- 语法错误特征\n",
    "- 标点特征\n",
    "- 老师给的特征（与上面的有重叠）\n",
    "- 语义特征（word2vec向量+聚类特征）\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "bf2252ad",
   "metadata": {},
   "source": [
    "- 1. 老师给的91个特征"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 284,
   "id": "a425e503",
   "metadata": {},
   "outputs": [],
   "source": [
    "features_91 = pd.read_pickle(\"features_91.pkl\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 266,
   "id": "4b8748e3",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>id</th>\n",
       "      <th>essay</th>\n",
       "      <th>score</th>\n",
       "      <th>corrected</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>10001</td>\n",
       "      <td>Dear Jerry. I've heard about that you will giv...</td>\n",
       "      <td>19.5</td>\n",
       "      <td>Dear Jerry. I have heard about that you will g...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>10002</td>\n",
       "      <td>Dear Jerry I'm glad that you'll respresent you...</td>\n",
       "      <td>16.5</td>\n",
       "      <td>Dear Jerry I am glad that you will respresent ...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>10003</td>\n",
       "      <td>Dear Jerry, I am very happy to hear that you w...</td>\n",
       "      <td>20.5</td>\n",
       "      <td>Dear Jerry, I am very happy to hear that you w...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>10004</td>\n",
       "      <td>Dear Je I'm so happy to hear that you will hav...</td>\n",
       "      <td>15.5</td>\n",
       "      <td>Dear Je I am so happy to hear that you will ha...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>10005</td>\n",
       "      <td>Dear Jerry, I am so glad to hear that you will...</td>\n",
       "      <td>19.0</td>\n",
       "      <td>Dear Jerry, I am so glad to hear that you will...</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "      id                                              essay  score  \\\n",
       "0  10001  Dear Jerry. I've heard about that you will giv...   19.5   \n",
       "1  10002  Dear Jerry I'm glad that you'll respresent you...   16.5   \n",
       "2  10003  Dear Jerry, I am very happy to hear that you w...   20.5   \n",
       "3  10004  Dear Je I'm so happy to hear that you will hav...   15.5   \n",
       "4  10005  Dear Jerry, I am so glad to hear that you will...   19.0   \n",
       "\n",
       "                                           corrected  \n",
       "0  Dear Jerry. I have heard about that you will g...  \n",
       "1  Dear Jerry I am glad that you will respresent ...  \n",
       "2  Dear Jerry, I am very happy to hear that you w...  \n",
       "3  Dear Je I am so happy to hear that you will ha...  \n",
       "4  Dear Jerry, I am so glad to hear that you will...  "
      ]
     },
     "execution_count": 266,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "## 开始特征生成\n",
    "data.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "d4b29c78",
   "metadata": {},
   "source": [
    "- 2. 词法特征"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 283,
   "id": "0c03501c",
   "metadata": {},
   "outputs": [],
   "source": [
    "def extract_word_features(data):\n",
    "    ''\n",
    "    features = data.copy()\n",
    "    \n",
    "    features['word_count'] = features['corrected'].apply(essay_len) \n",
    "    features['richess'] = features['corrected'].apply(richness) \n",
    "    features['rich_divide_total'] = features['corrected'].apply(rich_divide_total)\n",
    "    features['avg_word_len'] = features['corrected'].apply(avg_word_len) \n",
    "    \n",
    "    features['noun_count'], features['adj_count'], features['verb_count'], features['pre_count'],features['adv_count'],features['conj_count'] = zip(\n",
    "        *features['corrected'].map(count_pos))   \n",
    "    features['twl_len'],features[\"ten_len\"],features[\"eight_len\"],features[\"six_len\"],features[\"four_len\"] = zip(\n",
    "        *features['corrected'].map(words_len))   \n",
    "    features['count_spell_error']=features['corrected'].apply(count_spell_error) \n",
    "    features[\"char_count\"] = features['corrected'].apply(char_count)\n",
    "    features['count_lemmas'] = features[\"corrected\"].apply(count_lemmas)\n",
    "    features['get_lemma_richness'] = features[\"corrected\"].apply(get_lemma_richness)\n",
    "\n",
    "\n",
    "    return features\n",
    "\n",
    "#拿到特征\n",
    "word_features = extract_word_features(data)\n",
    "\n",
    "#print(features.columns)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 286,
   "id": "22f2a248",
   "metadata": {},
   "outputs": [],
   "source": [
    "word_features.drop([\"essay\",\"id\",'corrected','score'],inplace=True,axis=1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 288,
   "id": "95f1e601",
   "metadata": {},
   "outputs": [],
   "source": [
    "word_features.to_pickle(\"word_feature_V5.pkl\") # 共19个特征"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "8176b895",
   "metadata": {},
   "source": [
    "- 2. 句法特征"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "id": "ead71bee",
   "metadata": {},
   "outputs": [],
   "source": [
    "def extract_sent_features(data):\n",
    "    \n",
    "    features = data.copy()\n",
    "    \n",
    "    features['sent_count'] = features['corrected'].apply(sent_count) \n",
    "    features['avg_num'],features['avg_var'] = zip(\n",
    "        *features['corrected'].map(get_avg_sents_var))   \n",
    "    features['tf'],features['of'],features['ten'],features['five'] = zip(\n",
    "        *features['corrected'].map(dif_len_sents)) \n",
    "    features['noun'],features['verbs'],features['adj'],features['emo'],features['pre'] =  zip(\n",
    "        *features['corrected'].map(avg_pos)) \n",
    "    features['avg_sign'] = features['corrected'].apply(avg_signal) \n",
    "#     features['sbar'],features['vp'],features['np'],features['adjp'],features['advp']=zip(\n",
    "#         *features['corrected'].map(get_vps))  #这个实在是跑不出来 一直报错\n",
    "\n",
    "\n",
    "    return features\n",
    "\n",
    "#拿到特征\n",
    "sent_features = extract_sent_features(data)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "id": "0f076ba0",
   "metadata": {},
   "outputs": [],
   "source": [
    "sent_features.drop([\"essay\",\"id\",'corrected','score'],inplace=True,axis=1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "id": "65055c96",
   "metadata": {},
   "outputs": [],
   "source": [
    "sent_features.to_pickle(\"sent_features_V5.pkl\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "08e63346",
   "metadata": {},
   "source": [
    "- 4. 语法正确性特征"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "b8841603",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n",
      "success\n"
     ]
    }
   ],
   "source": [
    "# def extract_grammer_features(data):\n",
    "#     features = data.copy()\n",
    "#     features[\"grammer_error\"] = features['corrected'].apply(grammer_error)\n",
    "#     return features\n",
    "\n",
    "# grammer_features = extract_grammer_features(data)\n",
    "\n",
    "features = data.copy()\n",
    "grammer_errors = []\n",
    "tool = language_tool_python.LanguageTool('en-US')\n",
    "for txt in features[\"corrected\"]: \n",
    "    try:\n",
    "        matches = tool.check(txt)\n",
    "        length = len(matches)\n",
    "        grammer_errors.append(length)\n",
    "        print(\"success\")\n",
    "    except Exception as e:\n",
    "        grammer_errors.append(0)\n",
    "        print(\"failed:\"+e)\n",
    "\n",
    "    "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "5cb5f441",
   "metadata": {},
   "outputs": [],
   "source": [
    "#把列表转换为数据框\n",
    "grammer_features = pd.DataFrame(grammer_errors)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "122a6676",
   "metadata": {},
   "outputs": [],
   "source": [
    "grammer_features.to_pickle(\"grammer_features_V5.pkl\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "906590ac",
   "metadata": {},
   "source": [
    "- 5. 标点特征（影响不大）"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 305,
   "id": "1371552a",
   "metadata": {},
   "outputs": [],
   "source": [
    "def extract_signal_features(data):\n",
    "    \n",
    "    features = data.copy()\n",
    "\n",
    "    features['comma'] = features.apply(lambda x: x['corrected'].count(','), axis=1)\n",
    "    features['question'] = features.apply(lambda x: x['corrected'].count('?'), axis=1)\n",
    "    features['exclamation'] = features.apply(lambda x: x['corrected'].count('!'), axis=1)\n",
    "    features['quotation'] = features.apply(lambda x: x['corrected'].count('\"') + x['corrected'].count(\"'\"), axis=1)\n",
    "    return features\n",
    "\n",
    "signal_features = extract_signal_features(data)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 306,
   "id": "1d69c836",
   "metadata": {},
   "outputs": [],
   "source": [
    "signal_features.drop([\"essay\",\"id\",'corrected','score'],inplace=True,axis=1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 308,
   "id": "b4df8154",
   "metadata": {},
   "outputs": [],
   "source": [
    "signal_features.to_pickle(\"signal_features_V5.pkl\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a82ac1e1",
   "metadata": {},
   "source": [
    "- 6. 语义特征"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 49,
   "id": "1ca10801",
   "metadata": {},
   "outputs": [],
   "source": [
    "word2vec = word2vec\n",
    "word2vec.to_pickle(\"word2vec_V5.pkl\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "f48a8dc4",
   "metadata": {},
   "source": [
    "- 7. 主题特征"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 45,
   "id": "bf307024",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100%|██████████████████████████████████████████████| 1001/1001 [00:36<00:00, 27.13it/s]\n"
     ]
    }
   ],
   "source": [
    "from tqdm import tqdm\n",
    "features = data.copy()\n",
    "themes = []\n",
    "for essay in tqdm(features[\"corrected\"]):\n",
    "    essay_themes = get_themes(essay)\n",
    "    themes.append(essay_themes)\n",
    "theme_features = pd.DataFrame(themes)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 48,
   "id": "0776706c",
   "metadata": {},
   "outputs": [],
   "source": [
    "theme_features.to_pickle(\"theme_features_V5.pkl\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "27b84c2a",
   "metadata": {},
   "source": [
    "## 总共有六种特征，现在对特征做清洗与拼接实验"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 131,
   "id": "8852932b",
   "metadata": {},
   "outputs": [],
   "source": [
    "word_features = pd.read_pickle(\"word_feature_V5.pkl\")\n",
    "sent_features = pd.read_pickle(\"sent_features_V5.pkl\")\n",
    "grammer_features = pd.read_pickle(\"grammer_features_V5.pkl\")\n",
    "signal_features = pd.read_pickle(\"signal_features_V5.pkl\")\n",
    "word2vec = pd.read_pickle(\"word2vec_V5.pkl\")\n",
    "theme_features = pd.read_pickle(\"theme_features_V5.pkl\")\n",
    "features_91 = pd.read_pickle(\"features_91.pkl\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 132,
   "id": "b60ec64b",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 修改grammer_check的index名字\n",
    "grammer_features.columns = [\"grammer_errors\"]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 133,
   "id": "9efbf3f4",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Index(['word_count', 'richess', 'rich_divide_total', 'avg_word_len',\n",
      "       'noun_count', 'adj_count', 'verb_count', 'pre_count', 'adv_count',\n",
      "       'conj_count', 'twl_len', 'ten_len', 'eight_len', 'six_len', 'four_len',\n",
      "       'count_spell_error', 'char_count', 'count_lemmas',\n",
      "       'get_lemma_richness'],\n",
      "      dtype='object')\n",
      "Index(['sent_count', 'avg_num', 'avg_var', 'tf', 'of', 'ten', 'five', 'noun',\n",
      "       'verbs', 'adj', 'emo', 'pre', 'avg_sign'],\n",
      "      dtype='object')\n",
      "Index(['comma', 'question', 'exclamation', 'quotation'], dtype='object')\n",
      "Index(['grammer_errors'], dtype='object')\n",
      "Index(['RDFRE', 'RDFKGL', 'CNCPos', 'CNCNeg', 'CNCLogic', 'CNCTempx', 'CNCAll',\n",
      "       'CNCAdd', 'CNCADC', 'CNCCaus', 'CNCTemp', 'SYNMEDpos', 'SYNMEDlem',\n",
      "       'SYNSTRUTt', 'SYNNP', 'SYNMEDwrd', 'SYNLE', 'SYNSTRUTa', 'LDTTRv',\n",
      "       'LDMTLDa', 'LDTTRa', 'LDTTRc', 'DESWC', 'DESMaxSL', 'DESSLd', 'DESWTC',\n",
      "       'DESPLd', 'DESWLsy', 'DESWLlt', 'DESPL', 'DESSL', 'DESWLsyd', 'DESPC',\n",
      "       'DESWLltd', 'DESSC', 'CRFNO1', 'CRFCWO1', 'CRFAOa', 'CRFSO1',\n",
      "       'CRFCWO1d', 'CRFNOa', 'CRFCWOa', 'CRFAO1', 'CRFSOa', 'CRFCWOad',\n",
      "       'WRDPRP2', 'WRDIMGc', 'WRDADJ', 'WRDHYPv', 'WRDNOUN', 'WRDFRQc',\n",
      "       'WRDMEAc', 'WRDFRQa', 'WRDFAMc', 'WRDPOLc', 'WRDAOAc', 'WRDHYPnv',\n",
      "       'WRDADV', 'WRDHYPn', 'WRDPRP1p', 'WRDVERB', 'WRDPRP3s', 'WRDPRP1s',\n",
      "       'WRDPRO', 'WRDFRQmc', 'WRDCNCc', 'WRDPRP3p', 'LSAGNd', 'LSAGN',\n",
      "       'LSASSp', 'LSASS1', 'LSAPP1', 'LSASSpd', 'LSAPP1d', 'LSASS1d',\n",
      "       'SMCAUSvp', 'SMCAUSr', 'SMCAUSlsa', 'SMTEMP', 'SMINTEr', 'SMINTEp',\n",
      "       'SMCAUSv', 'SMCAUSwn', 'DRNEG', 'DRVP', 'DRGERUND', 'DRPVAL', 'DRPP',\n",
      "       'DRNP', 'DRINF', 'DRAP'],\n",
      "      dtype='object')\n",
      "RangeIndex(start=0, stop=10, step=1)\n"
     ]
    }
   ],
   "source": [
    "print(word_features.columns)\n",
    "print(sent_features.columns)\n",
    "print(signal_features.columns)\n",
    "print(grammer_features.columns)\n",
    "print(features_91.columns)\n",
    "print(theme_features.columns)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 138,
   "id": "ef77c4fb",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 拼接除了词向量之外的特征\n",
    "X = pd.DataFrame(pd.concat((word_features,sent_features,grammer_features,signal_features,theme_features,features_91), axis = 1,ignore_index=False))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 139,
   "id": "1652f478",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(1001, 138)"
      ]
     },
     "execution_count": 139,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 140,
   "id": "b7da5d10",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "False\n"
     ]
    }
   ],
   "source": [
    "# 填充空值\n",
    "X.fillna(0,inplace=True)\n",
    "print(np.isnan(X.values).any())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 141,
   "id": "a4549497",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "word_count              int64\n",
      "richess                 int64\n",
      "rich_divide_total     float64\n",
      "avg_word_len          float64\n",
      "noun_count            float64\n",
      "adj_count             float64\n",
      "verb_count            float64\n",
      "pre_count             float64\n",
      "adv_count             float64\n",
      "conj_count            float64\n",
      "twl_len                 int32\n",
      "ten_len                 int32\n",
      "eight_len               int32\n",
      "six_len                 int32\n",
      "four_len                int32\n",
      "count_spell_error       int64\n",
      "char_count              int64\n",
      "count_lemmas            int64\n",
      "get_lemma_richness      int64\n",
      "sent_count              int64\n",
      "avg_num               float64\n",
      "avg_var               float64\n",
      "tf                      int32\n",
      "of                      int32\n",
      "ten                     int32\n",
      "five                    int32\n",
      "noun                  float64\n",
      "verbs                 float64\n",
      "adj                   float64\n",
      "emo                   float64\n",
      "pre                   float64\n",
      "avg_sign              float64\n",
      "grammer_errors          int64\n",
      "comma                   int64\n",
      "question                int64\n",
      "exclamation             int64\n",
      "quotation               int64\n",
      "0                       int64\n",
      "1                       int64\n",
      "2                       int64\n",
      "3                       int64\n",
      "4                       int64\n",
      "5                       int64\n",
      "6                       int64\n",
      "7                       int64\n",
      "8                       int64\n",
      "9                       int64\n",
      "RDFRE                 float64\n",
      "RDFKGL                float64\n",
      "CNCPos                float64\n",
      "CNCNeg                float64\n",
      "CNCLogic              float64\n",
      "CNCTempx              float64\n",
      "CNCAll                float64\n",
      "CNCAdd                float64\n",
      "CNCADC                float64\n",
      "CNCCaus               float64\n",
      "CNCTemp               float64\n",
      "SYNMEDpos             float64\n",
      "SYNMEDlem             float64\n",
      "SYNSTRUTt             float64\n",
      "SYNNP                 float64\n",
      "SYNMEDwrd             float64\n",
      "SYNLE                 float64\n",
      "SYNSTRUTa             float64\n",
      "LDTTRv                float64\n",
      "LDMTLDa               float64\n",
      "LDTTRa                float64\n",
      "LDTTRc                float64\n",
      "DESWC                 float64\n",
      "DESMaxSL              float64\n",
      "DESSLd                float64\n",
      "DESWTC                float64\n",
      "DESPLd                float64\n",
      "DESWLsy               float64\n",
      "DESWLlt               float64\n",
      "DESPL                 float64\n",
      "DESSL                 float64\n",
      "DESWLsyd              float64\n",
      "DESPC                 float64\n",
      "DESWLltd              float64\n",
      "DESSC                 float64\n",
      "CRFNO1                float64\n",
      "CRFCWO1               float64\n",
      "CRFAOa                float64\n",
      "CRFSO1                float64\n",
      "CRFCWO1d              float64\n",
      "CRFNOa                float64\n",
      "CRFCWOa               float64\n",
      "CRFAO1                float64\n",
      "CRFSOa                float64\n",
      "CRFCWOad              float64\n",
      "WRDPRP2               float64\n",
      "WRDIMGc               float64\n",
      "WRDADJ                float64\n",
      "WRDHYPv               float64\n",
      "WRDNOUN               float64\n",
      "WRDFRQc               float64\n",
      "WRDMEAc               float64\n",
      "WRDFRQa               float64\n",
      "WRDFAMc               float64\n",
      "WRDPOLc               float64\n",
      "WRDAOAc               float64\n",
      "WRDHYPnv              float64\n",
      "WRDADV                float64\n",
      "WRDHYPn               float64\n",
      "WRDPRP1p              float64\n",
      "WRDVERB               float64\n",
      "WRDPRP3s              float64\n",
      "WRDPRP1s              float64\n",
      "WRDPRO                float64\n",
      "WRDFRQmc              float64\n",
      "WRDCNCc               float64\n",
      "WRDPRP3p              float64\n",
      "LSAGNd                float64\n",
      "LSAGN                 float64\n",
      "LSASSp                float64\n",
      "LSASS1                float64\n",
      "LSAPP1                float64\n",
      "LSASSpd               float64\n",
      "LSAPP1d               float64\n",
      "LSASS1d               float64\n",
      "SMCAUSvp              float64\n",
      "SMCAUSr               float64\n",
      "SMCAUSlsa             float64\n",
      "SMTEMP                float64\n",
      "SMINTEr               float64\n",
      "SMINTEp               float64\n",
      "SMCAUSv               float64\n",
      "SMCAUSwn              float64\n",
      "DRNEG                 float64\n",
      "DRVP                  float64\n",
      "DRGERUND              float64\n",
      "DRPVAL                float64\n",
      "DRPP                  float64\n",
      "DRNP                  float64\n",
      "DRINF                 float64\n",
      "DRAP                  float64\n",
      "dtype: object\n"
     ]
    }
   ],
   "source": [
    "#查看数据类型\n",
    "pd.options.display.max_rows = None # 显示所有属性\n",
    "print(X.dtypes)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 142,
   "id": "6396a22c",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>word_count</th>\n",
       "      <th>richess</th>\n",
       "      <th>rich_divide_total</th>\n",
       "      <th>avg_word_len</th>\n",
       "      <th>noun_count</th>\n",
       "      <th>adj_count</th>\n",
       "      <th>verb_count</th>\n",
       "      <th>pre_count</th>\n",
       "      <th>adv_count</th>\n",
       "      <th>conj_count</th>\n",
       "      <th>...</th>\n",
       "      <th>SMCAUSv</th>\n",
       "      <th>SMCAUSwn</th>\n",
       "      <th>DRNEG</th>\n",
       "      <th>DRVP</th>\n",
       "      <th>DRGERUND</th>\n",
       "      <th>DRPVAL</th>\n",
       "      <th>DRPP</th>\n",
       "      <th>DRNP</th>\n",
       "      <th>DRINF</th>\n",
       "      <th>DRAP</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>293</th>\n",
       "      <td>5</td>\n",
       "      <td>5</td>\n",
       "      <td>1.0</td>\n",
       "      <td>3.800000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>285.714286</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>528</th>\n",
       "      <td>6</td>\n",
       "      <td>6</td>\n",
       "      <td>1.0</td>\n",
       "      <td>3.333333</td>\n",
       "      <td>0.833333</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>500.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>750</th>\n",
       "      <td>6</td>\n",
       "      <td>6</td>\n",
       "      <td>1.0</td>\n",
       "      <td>3.666667</td>\n",
       "      <td>0.666667</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.166667</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>125.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>375.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>3 rows × 138 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "     word_count  richess  rich_divide_total  avg_word_len  noun_count  \\\n",
       "293           5        5                1.0      3.800000    1.000000   \n",
       "528           6        6                1.0      3.333333    0.833333   \n",
       "750           6        6                1.0      3.666667    0.666667   \n",
       "\n",
       "     adj_count  verb_count  pre_count  adv_count  conj_count  ...  SMCAUSv  \\\n",
       "293        0.0    0.000000        0.0        0.0         0.0  ...      0.0   \n",
       "528        0.0    0.000000        0.0        0.0         0.0  ...      0.0   \n",
       "750        0.0    0.166667        0.0        0.0         0.0  ...      0.0   \n",
       "\n",
       "     SMCAUSwn  DRNEG   DRVP  DRGERUND  DRPVAL  DRPP        DRNP  DRINF  DRAP  \n",
       "293       0.0    0.0    0.0       0.0     0.0   0.0  285.714286    0.0   0.0  \n",
       "528       0.0    0.0    0.0       0.0     0.0   0.0  500.000000    0.0   0.0  \n",
       "750       0.0    0.0  125.0       0.0     0.0   0.0  375.000000    0.0   0.0  \n",
       "\n",
       "[3 rows x 138 columns]"
      ]
     },
     "execution_count": 142,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 查看哪些数据是inf 无限值\n",
    "X.iloc[X.values==np.inf]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 232,
   "id": "d281b4fd",
   "metadata": {},
   "outputs": [],
   "source": [
    "## 因为只有三行，所以我把这三行删掉\n",
    "inf_row = [293,528,750]\n",
    "X_no_inf=X.drop(inf_row,axis=0) \n",
    "word2vec_new = word2vec.drop(inf_row,axis=0)\n",
    "score = data[\"score\"].drop(inf_row,axis=0).values"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 144,
   "id": "765c48db",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>word_count</th>\n",
       "      <th>richess</th>\n",
       "      <th>rich_divide_total</th>\n",
       "      <th>avg_word_len</th>\n",
       "      <th>noun_count</th>\n",
       "      <th>adj_count</th>\n",
       "      <th>verb_count</th>\n",
       "      <th>pre_count</th>\n",
       "      <th>adv_count</th>\n",
       "      <th>conj_count</th>\n",
       "      <th>...</th>\n",
       "      <th>SMCAUSv</th>\n",
       "      <th>SMCAUSwn</th>\n",
       "      <th>DRNEG</th>\n",
       "      <th>DRVP</th>\n",
       "      <th>DRGERUND</th>\n",
       "      <th>DRPVAL</th>\n",
       "      <th>DRPP</th>\n",
       "      <th>DRNP</th>\n",
       "      <th>DRINF</th>\n",
       "      <th>DRAP</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>0 rows × 138 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "Empty DataFrame\n",
       "Columns: [word_count, richess, rich_divide_total, avg_word_len, noun_count, adj_count, verb_count, pre_count, adv_count, conj_count, twl_len, ten_len, eight_len, six_len, four_len, count_spell_error, char_count, count_lemmas, get_lemma_richness, sent_count, avg_num, avg_var, tf, of, ten, five, noun, verbs, adj, emo, pre, avg_sign, grammer_errors, comma, question, exclamation, quotation, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, RDFRE, RDFKGL, CNCPos, CNCNeg, CNCLogic, CNCTempx, CNCAll, CNCAdd, CNCADC, CNCCaus, CNCTemp, SYNMEDpos, SYNMEDlem, SYNSTRUTt, SYNNP, SYNMEDwrd, SYNLE, SYNSTRUTa, LDTTRv, LDMTLDa, LDTTRa, LDTTRc, DESWC, DESMaxSL, DESSLd, DESWTC, DESPLd, DESWLsy, DESWLlt, DESPL, DESSL, DESWLsyd, DESPC, DESWLltd, DESSC, CRFNO1, CRFCWO1, CRFAOa, CRFSO1, CRFCWO1d, CRFNOa, CRFCWOa, CRFAO1, CRFSOa, CRFCWOad, WRDPRP2, WRDIMGc, WRDADJ, WRDHYPv, WRDNOUN, WRDFRQc, WRDMEAc, WRDFRQa, ...]\n",
       "Index: []\n",
       "\n",
       "[0 rows x 138 columns]"
      ]
     },
     "execution_count": 144,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#再次查看无限值情况\n",
    "X_no_inf.iloc[X_no_inf.values==np.inf]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 145,
   "id": "b912300e",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "998"
      ]
     },
     "execution_count": 145,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "len(score)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 146,
   "id": "2c0c4e78",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(998, 138)"
      ]
     },
     "execution_count": 146,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X_no_inf.shape"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c4f3b7ec",
   "metadata": {},
   "source": [
    "## 探索数据之间的关系"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 148,
   "id": "29dec50e",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "D:\\Program\\anaconda\\lib\\site-packages\\numpy\\lib\\function_base.py:2642: RuntimeWarning: invalid value encountered in true_divide\n",
      "  c /= stddev[:, None]\n",
      "D:\\Program\\anaconda\\lib\\site-packages\\numpy\\lib\\function_base.py:2643: RuntimeWarning: invalid value encountered in true_divide\n",
      "  c /= stddev[None, :]\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>col_labels</th>\n",
       "      <th>corr_values</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>17</th>\n",
       "      <td>count_lemmas</td>\n",
       "      <td>0.797401</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>18</th>\n",
       "      <td>get_lemma_richness</td>\n",
       "      <td>0.797361</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>72</th>\n",
       "      <td>DESWTC</td>\n",
       "      <td>0.793362</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>16</th>\n",
       "      <td>char_count</td>\n",
       "      <td>0.771296</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>richess</td>\n",
       "      <td>0.764892</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>word_count</td>\n",
       "      <td>0.750788</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>69</th>\n",
       "      <td>DESWC</td>\n",
       "      <td>0.747479</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>14</th>\n",
       "      <td>four_len</td>\n",
       "      <td>0.689440</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>38</th>\n",
       "      <td>1</td>\n",
       "      <td>0.678709</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>103</th>\n",
       "      <td>WRDHYPnv</td>\n",
       "      <td>0.637264</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>13</th>\n",
       "      <td>six_len</td>\n",
       "      <td>0.614995</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>40</th>\n",
       "      <td>3</td>\n",
       "      <td>0.614749</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>131</th>\n",
       "      <td>DRVP</td>\n",
       "      <td>0.595670</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>45</th>\n",
       "      <td>8</td>\n",
       "      <td>0.588835</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>46</th>\n",
       "      <td>9</td>\n",
       "      <td>0.580183</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>127</th>\n",
       "      <td>SMINTEp</td>\n",
       "      <td>0.580050</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>12</th>\n",
       "      <td>eight_len</td>\n",
       "      <td>0.576561</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>99</th>\n",
       "      <td>WRDFRQa</td>\n",
       "      <td>0.573558</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>100</th>\n",
       "      <td>WRDFAMc</td>\n",
       "      <td>0.572334</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>80</th>\n",
       "      <td>DESWLltd</td>\n",
       "      <td>0.564719</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>107</th>\n",
       "      <td>WRDVERB</td>\n",
       "      <td>0.560911</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>66</th>\n",
       "      <td>LDMTLDa</td>\n",
       "      <td>0.539293</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>93</th>\n",
       "      <td>WRDIMGc</td>\n",
       "      <td>0.538477</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>101</th>\n",
       "      <td>WRDPOLc</td>\n",
       "      <td>0.537101</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>verb_count</td>\n",
       "      <td>0.519379</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>65</th>\n",
       "      <td>LDTTRv</td>\n",
       "      <td>0.515170</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>86</th>\n",
       "      <td>CRFCWO1d</td>\n",
       "      <td>0.509913</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>122</th>\n",
       "      <td>SMCAUSvp</td>\n",
       "      <td>0.504411</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>92</th>\n",
       "      <td>WRDPRP2</td>\n",
       "      <td>0.501519</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>105</th>\n",
       "      <td>WRDHYPn</td>\n",
       "      <td>0.494293</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>94</th>\n",
       "      <td>WRDADJ</td>\n",
       "      <td>0.491875</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>128</th>\n",
       "      <td>SMCAUSv</td>\n",
       "      <td>0.487388</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>112</th>\n",
       "      <td>WRDCNCc</td>\n",
       "      <td>0.486767</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>42</th>\n",
       "      <td>5</td>\n",
       "      <td>0.482860</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>adj_count</td>\n",
       "      <td>0.479911</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>95</th>\n",
       "      <td>WRDHYPv</td>\n",
       "      <td>0.464694</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>37</th>\n",
       "      <td>0</td>\n",
       "      <td>0.462211</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>110</th>\n",
       "      <td>WRDPRO</td>\n",
       "      <td>0.457406</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>76</th>\n",
       "      <td>DESPL</td>\n",
       "      <td>0.454332</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>81</th>\n",
       "      <td>DESSC</td>\n",
       "      <td>0.454332</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>19</th>\n",
       "      <td>sent_count</td>\n",
       "      <td>0.453642</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>adv_count</td>\n",
       "      <td>0.451556</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>53</th>\n",
       "      <td>CNCAll</td>\n",
       "      <td>0.450619</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>135</th>\n",
       "      <td>DRNP</td>\n",
       "      <td>0.447613</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>49</th>\n",
       "      <td>CNCPos</td>\n",
       "      <td>0.444835</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>48</th>\n",
       "      <td>RDFKGL</td>\n",
       "      <td>0.444603</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>43</th>\n",
       "      <td>6</td>\n",
       "      <td>0.443621</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>104</th>\n",
       "      <td>WRDADV</td>\n",
       "      <td>0.432373</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>102</th>\n",
       "      <td>WRDAOAc</td>\n",
       "      <td>0.425354</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>134</th>\n",
       "      <td>DRPP</td>\n",
       "      <td>0.425334</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>74</th>\n",
       "      <td>DESWLsy</td>\n",
       "      <td>0.421801</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>pre_count</td>\n",
       "      <td>0.391326</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>119</th>\n",
       "      <td>LSASSpd</td>\n",
       "      <td>0.389992</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>97</th>\n",
       "      <td>WRDFRQc</td>\n",
       "      <td>0.385641</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>136</th>\n",
       "      <td>DRINF</td>\n",
       "      <td>0.380264</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>41</th>\n",
       "      <td>4</td>\n",
       "      <td>0.380011</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>23</th>\n",
       "      <td>of</td>\n",
       "      <td>0.379573</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>29</th>\n",
       "      <td>emo</td>\n",
       "      <td>0.371706</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11</th>\n",
       "      <td>ten_len</td>\n",
       "      <td>0.367642</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>24</th>\n",
       "      <td>ten</td>\n",
       "      <td>0.358182</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>33</th>\n",
       "      <td>comma</td>\n",
       "      <td>0.354144</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>28</th>\n",
       "      <td>adj</td>\n",
       "      <td>0.346547</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>27</th>\n",
       "      <td>verbs</td>\n",
       "      <td>0.338210</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>54</th>\n",
       "      <td>CNCAdd</td>\n",
       "      <td>0.330368</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>70</th>\n",
       "      <td>DESMaxSL</td>\n",
       "      <td>0.320953</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>91</th>\n",
       "      <td>CRFCWOad</td>\n",
       "      <td>0.317746</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>39</th>\n",
       "      <td>2</td>\n",
       "      <td>0.306257</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>137</th>\n",
       "      <td>DRAP</td>\n",
       "      <td>0.305415</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>conj_count</td>\n",
       "      <td>0.303469</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>129</th>\n",
       "      <td>SMCAUSwn</td>\n",
       "      <td>0.299620</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>121</th>\n",
       "      <td>LSASS1d</td>\n",
       "      <td>0.292925</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>85</th>\n",
       "      <td>CRFSO1</td>\n",
       "      <td>0.292856</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>98</th>\n",
       "      <td>WRDMEAc</td>\n",
       "      <td>0.285533</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>56</th>\n",
       "      <td>CNCCaus</td>\n",
       "      <td>0.285018</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>83</th>\n",
       "      <td>CRFCWO1</td>\n",
       "      <td>0.283691</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>20</th>\n",
       "      <td>avg_num</td>\n",
       "      <td>0.283664</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>77</th>\n",
       "      <td>DESSL</td>\n",
       "      <td>0.282652</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>30</th>\n",
       "      <td>pre</td>\n",
       "      <td>0.268609</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>25</th>\n",
       "      <td>five</td>\n",
       "      <td>0.267396</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>32</th>\n",
       "      <td>grammer_errors</td>\n",
       "      <td>0.242679</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>57</th>\n",
       "      <td>CNCTemp</td>\n",
       "      <td>0.241275</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>36</th>\n",
       "      <td>quotation</td>\n",
       "      <td>0.234485</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>132</th>\n",
       "      <td>DRGERUND</td>\n",
       "      <td>0.230331</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>15</th>\n",
       "      <td>count_spell_error</td>\n",
       "      <td>0.224585</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>51</th>\n",
       "      <td>CNCLogic</td>\n",
       "      <td>0.210051</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>90</th>\n",
       "      <td>CRFSOa</td>\n",
       "      <td>0.205764</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>88</th>\n",
       "      <td>CRFCWOa</td>\n",
       "      <td>0.203484</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>71</th>\n",
       "      <td>DESSLd</td>\n",
       "      <td>0.202387</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>114</th>\n",
       "      <td>LSAGNd</td>\n",
       "      <td>0.192433</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>22</th>\n",
       "      <td>tf</td>\n",
       "      <td>0.189161</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>87</th>\n",
       "      <td>CRFNOa</td>\n",
       "      <td>0.186647</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>108</th>\n",
       "      <td>WRDPRP3s</td>\n",
       "      <td>0.186160</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>84</th>\n",
       "      <td>CRFAOa</td>\n",
       "      <td>0.185580</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>89</th>\n",
       "      <td>CRFAO1</td>\n",
       "      <td>0.185437</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>82</th>\n",
       "      <td>CRFNO1</td>\n",
       "      <td>0.184893</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>75</th>\n",
       "      <td>DESWLlt</td>\n",
       "      <td>0.184862</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>35</th>\n",
       "      <td>exclamation</td>\n",
       "      <td>0.177485</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>50</th>\n",
       "      <td>CNCNeg</td>\n",
       "      <td>0.173141</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>123</th>\n",
       "      <td>SMCAUSr</td>\n",
       "      <td>0.168376</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>126</th>\n",
       "      <td>SMINTEr</td>\n",
       "      <td>0.162758</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>avg_word_len</td>\n",
       "      <td>0.161993</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>111</th>\n",
       "      <td>WRDFRQmc</td>\n",
       "      <td>0.143704</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>115</th>\n",
       "      <td>LSAGN</td>\n",
       "      <td>0.135393</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>10</th>\n",
       "      <td>twl_len</td>\n",
       "      <td>0.134393</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>113</th>\n",
       "      <td>WRDPRP3p</td>\n",
       "      <td>0.114006</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>124</th>\n",
       "      <td>SMCAUSlsa</td>\n",
       "      <td>0.102970</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>34</th>\n",
       "      <td>question</td>\n",
       "      <td>0.095661</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>55</th>\n",
       "      <td>CNCADC</td>\n",
       "      <td>0.094168</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>109</th>\n",
       "      <td>WRDPRP1s</td>\n",
       "      <td>0.089087</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>21</th>\n",
       "      <td>avg_var</td>\n",
       "      <td>0.034653</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>44</th>\n",
       "      <td>7</td>\n",
       "      <td>-0.023299</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>106</th>\n",
       "      <td>WRDPRP1p</td>\n",
       "      <td>-0.032447</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>31</th>\n",
       "      <td>avg_sign</td>\n",
       "      <td>-0.116843</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>78</th>\n",
       "      <td>DESWLsyd</td>\n",
       "      <td>-0.120756</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>26</th>\n",
       "      <td>noun</td>\n",
       "      <td>-0.239887</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>125</th>\n",
       "      <td>SMTEMP</td>\n",
       "      <td>-0.350336</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>68</th>\n",
       "      <td>LDTTRc</td>\n",
       "      <td>-0.468864</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>47</th>\n",
       "      <td>RDFRE</td>\n",
       "      <td>-0.481724</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>117</th>\n",
       "      <td>LSASS1</td>\n",
       "      <td>-0.610643</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>67</th>\n",
       "      <td>LDTTRa</td>\n",
       "      <td>-0.624865</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>116</th>\n",
       "      <td>LSASSp</td>\n",
       "      <td>-0.656826</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>rich_divide_total</td>\n",
       "      <td>-0.665872</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>96</th>\n",
       "      <td>WRDNOUN</td>\n",
       "      <td>-0.677352</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>noun_count</td>\n",
       "      <td>-0.685967</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>52</th>\n",
       "      <td>CNCTempx</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>58</th>\n",
       "      <td>SYNMEDpos</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>59</th>\n",
       "      <td>SYNMEDlem</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>60</th>\n",
       "      <td>SYNSTRUTt</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>61</th>\n",
       "      <td>SYNNP</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>62</th>\n",
       "      <td>SYNMEDwrd</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>63</th>\n",
       "      <td>SYNLE</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>64</th>\n",
       "      <td>SYNSTRUTa</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>73</th>\n",
       "      <td>DESPLd</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>79</th>\n",
       "      <td>DESPC</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>118</th>\n",
       "      <td>LSAPP1</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>120</th>\n",
       "      <td>LSAPP1d</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>130</th>\n",
       "      <td>DRNEG</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>133</th>\n",
       "      <td>DRPVAL</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "             col_labels  corr_values\n",
       "17         count_lemmas     0.797401\n",
       "18   get_lemma_richness     0.797361\n",
       "72               DESWTC     0.793362\n",
       "16           char_count     0.771296\n",
       "1               richess     0.764892\n",
       "0            word_count     0.750788\n",
       "69                DESWC     0.747479\n",
       "14             four_len     0.689440\n",
       "38                    1     0.678709\n",
       "103            WRDHYPnv     0.637264\n",
       "13              six_len     0.614995\n",
       "40                    3     0.614749\n",
       "131                DRVP     0.595670\n",
       "45                    8     0.588835\n",
       "46                    9     0.580183\n",
       "127             SMINTEp     0.580050\n",
       "12            eight_len     0.576561\n",
       "99              WRDFRQa     0.573558\n",
       "100             WRDFAMc     0.572334\n",
       "80             DESWLltd     0.564719\n",
       "107             WRDVERB     0.560911\n",
       "66              LDMTLDa     0.539293\n",
       "93              WRDIMGc     0.538477\n",
       "101             WRDPOLc     0.537101\n",
       "6            verb_count     0.519379\n",
       "65               LDTTRv     0.515170\n",
       "86             CRFCWO1d     0.509913\n",
       "122            SMCAUSvp     0.504411\n",
       "92              WRDPRP2     0.501519\n",
       "105             WRDHYPn     0.494293\n",
       "94               WRDADJ     0.491875\n",
       "128             SMCAUSv     0.487388\n",
       "112             WRDCNCc     0.486767\n",
       "42                    5     0.482860\n",
       "5             adj_count     0.479911\n",
       "95              WRDHYPv     0.464694\n",
       "37                    0     0.462211\n",
       "110              WRDPRO     0.457406\n",
       "76                DESPL     0.454332\n",
       "81                DESSC     0.454332\n",
       "19           sent_count     0.453642\n",
       "8             adv_count     0.451556\n",
       "53               CNCAll     0.450619\n",
       "135                DRNP     0.447613\n",
       "49               CNCPos     0.444835\n",
       "48               RDFKGL     0.444603\n",
       "43                    6     0.443621\n",
       "104              WRDADV     0.432373\n",
       "102             WRDAOAc     0.425354\n",
       "134                DRPP     0.425334\n",
       "74              DESWLsy     0.421801\n",
       "7             pre_count     0.391326\n",
       "119             LSASSpd     0.389992\n",
       "97              WRDFRQc     0.385641\n",
       "136               DRINF     0.380264\n",
       "41                    4     0.380011\n",
       "23                   of     0.379573\n",
       "29                  emo     0.371706\n",
       "11              ten_len     0.367642\n",
       "24                  ten     0.358182\n",
       "33                comma     0.354144\n",
       "28                  adj     0.346547\n",
       "27                verbs     0.338210\n",
       "54               CNCAdd     0.330368\n",
       "70             DESMaxSL     0.320953\n",
       "91             CRFCWOad     0.317746\n",
       "39                    2     0.306257\n",
       "137                DRAP     0.305415\n",
       "9            conj_count     0.303469\n",
       "129            SMCAUSwn     0.299620\n",
       "121             LSASS1d     0.292925\n",
       "85               CRFSO1     0.292856\n",
       "98              WRDMEAc     0.285533\n",
       "56              CNCCaus     0.285018\n",
       "83              CRFCWO1     0.283691\n",
       "20              avg_num     0.283664\n",
       "77                DESSL     0.282652\n",
       "30                  pre     0.268609\n",
       "25                 five     0.267396\n",
       "32       grammer_errors     0.242679\n",
       "57              CNCTemp     0.241275\n",
       "36            quotation     0.234485\n",
       "132            DRGERUND     0.230331\n",
       "15    count_spell_error     0.224585\n",
       "51             CNCLogic     0.210051\n",
       "90               CRFSOa     0.205764\n",
       "88              CRFCWOa     0.203484\n",
       "71               DESSLd     0.202387\n",
       "114              LSAGNd     0.192433\n",
       "22                   tf     0.189161\n",
       "87               CRFNOa     0.186647\n",
       "108            WRDPRP3s     0.186160\n",
       "84               CRFAOa     0.185580\n",
       "89               CRFAO1     0.185437\n",
       "82               CRFNO1     0.184893\n",
       "75              DESWLlt     0.184862\n",
       "35          exclamation     0.177485\n",
       "50               CNCNeg     0.173141\n",
       "123             SMCAUSr     0.168376\n",
       "126             SMINTEr     0.162758\n",
       "3          avg_word_len     0.161993\n",
       "111            WRDFRQmc     0.143704\n",
       "115               LSAGN     0.135393\n",
       "10              twl_len     0.134393\n",
       "113            WRDPRP3p     0.114006\n",
       "124           SMCAUSlsa     0.102970\n",
       "34             question     0.095661\n",
       "55               CNCADC     0.094168\n",
       "109            WRDPRP1s     0.089087\n",
       "21              avg_var     0.034653\n",
       "44                    7    -0.023299\n",
       "106            WRDPRP1p    -0.032447\n",
       "31             avg_sign    -0.116843\n",
       "78             DESWLsyd    -0.120756\n",
       "26                 noun    -0.239887\n",
       "125              SMTEMP    -0.350336\n",
       "68               LDTTRc    -0.468864\n",
       "47                RDFRE    -0.481724\n",
       "117              LSASS1    -0.610643\n",
       "67               LDTTRa    -0.624865\n",
       "116              LSASSp    -0.656826\n",
       "2     rich_divide_total    -0.665872\n",
       "96              WRDNOUN    -0.677352\n",
       "4            noun_count    -0.685967\n",
       "52             CNCTempx          NaN\n",
       "58            SYNMEDpos          NaN\n",
       "59            SYNMEDlem          NaN\n",
       "60            SYNSTRUTt          NaN\n",
       "61                SYNNP          NaN\n",
       "62            SYNMEDwrd          NaN\n",
       "63                SYNLE          NaN\n",
       "64            SYNSTRUTa          NaN\n",
       "73               DESPLd          NaN\n",
       "79                DESPC          NaN\n",
       "118              LSAPP1          NaN\n",
       "120             LSAPP1d          NaN\n",
       "130               DRNEG          NaN\n",
       "133              DRPVAL          NaN"
      ]
     },
     "execution_count": 148,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "x_cols = [col for col in X_no_inf]#处理目标的其他所有特征\n",
    "labels = []\n",
    "values = []\n",
    "for col in x_cols:\n",
    "    labels.append(col)\n",
    "    values.append(np.corrcoef(X_no_inf[col],score)[0, 1])\n",
    "\n",
    "corr_df = pd.DataFrame({'col_labels':labels, 'corr_values':values})\n",
    "corr_df = corr_df.sort_values(by = 'corr_values',ascending=False)\n",
    "corr_df"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 149,
   "id": "29e55fda",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Text(0.5, 1.0, 'Correlation coefficient of the variables')"
      ]
     },
     "execution_count": 149,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 864x2880 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "ind = np.arange(len(labels))\n",
    "width = 0.5\n",
    "fig,ax = plt.subplots(figsize = (12,40))\n",
    "rects = ax.barh(ind, np.array(corr_df.corr_values.values), color='y')\n",
    " \n",
    "ax.set_yticks(ind)\n",
    "ax.set_yticklabels(corr_df.col_labels.values, rotation='horizontal')\n",
    "ax.set_xlabel('Correlation coefficient')\n",
    "ax.set_title('Correlation coefficient of the variables')"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "f1b6edf7",
   "metadata": {},
   "source": [
    "## 数据标准化"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 151,
   "id": "7d694f5e",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([1.45681296e+03, 2.29633002e+02, 1.59898524e-02, 4.94714555e-02,\n",
       "       2.75077313e-02, 7.64828563e-04, 2.34889470e-03, 6.70344856e-04,\n",
       "       7.20432408e-04, 1.82710147e-04, 2.98978719e-01, 2.34925964e+00,\n",
       "       1.44844800e+01, 4.94805332e+01, 1.79890375e+02, 1.64300394e+01,\n",
       "       2.65066002e+04, 4.37440758e+02, 4.37344284e+02, 2.41771639e+01,\n",
       "       2.07785198e+01, 1.47509261e+04, 5.16411581e-01, 1.86159092e+00,\n",
       "       2.44552532e+00, 8.23271794e+00, 1.05265722e+00, 1.05657607e+00,\n",
       "       2.52148578e-01, 1.89818729e-01, 1.27911151e-01, 3.26163929e-01,\n",
       "       4.14656246e+01, 1.31778838e+01, 2.22746093e-01, 1.01657523e+00,\n",
       "       1.19191188e+00, 4.59061901e+01, 5.69216077e+01, 9.11049353e+00,\n",
       "       7.83922002e+01, 6.05832908e+00, 7.88428159e+00, 5.85614516e+00,\n",
       "       1.02140654e+00, 2.78720658e+01, 7.95829695e+01, 1.05849530e+02,\n",
       "       5.22820670e+00, 4.87138502e+02, 3.25800485e+01, 1.36982047e+02,\n",
       "       0.00000000e+00, 2.97654784e+03, 2.17798415e+02, 3.88944518e+00,\n",
       "       1.56648337e+02, 1.24439771e+02, 0.00000000e+00, 0.00000000e+00,\n",
       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
       "       0.00000000e+00, 3.34762429e-02, 2.33997910e+02, 9.97898619e-03,\n",
       "       7.71528984e-03, 1.47123724e+03, 1.35166011e+02, 2.28907989e+01,\n",
       "       4.76400754e+02, 0.00000000e+00, 1.03308342e-02, 5.24966369e-02,\n",
       "       2.40022410e+01, 2.14639495e+01, 8.18191905e-03, 0.00000000e+00,\n",
       "       9.14323072e-02, 2.40022410e+01, 2.06464936e-02, 3.43772857e-02,\n",
       "       2.51221707e-04, 3.52578429e-02, 2.10709880e-02, 2.44105957e-04,\n",
       "       3.35921418e-04, 2.08321997e-02, 3.56682770e-04, 1.58656200e-03,\n",
       "       7.77006441e+02, 1.51534721e+03, 5.28508382e+02, 2.72552748e-02,\n",
       "       1.15126246e+04, 3.99972219e+08, 1.36157529e+03, 1.32831656e-01,\n",
       "       4.05161210e+03, 2.38417543e+00, 4.40824203e+02, 2.88529104e-02,\n",
       "       4.74546295e+02, 2.25634199e-03, 1.20721152e+01, 1.65179246e+03,\n",
       "       8.43471099e+01, 2.31764327e+02, 1.54380613e+03, 5.14432438e-01,\n",
       "       1.13681513e+03, 2.40563917e+01, 1.50866161e-02, 1.33704608e-02,\n",
       "       3.82153024e-02, 4.07281076e-02, 0.00000000e+00, 5.04605466e-03,\n",
       "       0.00000000e+00, 1.03415140e-02, 1.12525194e+03, 1.29982929e-02,\n",
       "       5.28357908e-03, 3.00711308e-02, 3.24901046e-04, 1.64377236e+03,\n",
       "       8.90488522e+02, 1.63325765e-03, 0.00000000e+00, 3.43861597e+03,\n",
       "       8.63998163e+01, 0.00000000e+00, 4.23354582e+02, 1.90697724e+03,\n",
       "       2.72413332e+02, 2.22628387e+02])"
      ]
     },
     "execution_count": 151,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 数据标准化\n",
    "from sklearn.preprocessing import StandardScaler\n",
    "X_new = X_no_inf.values\n",
    "y = score\n",
    "scaler = StandardScaler() #实例化\n",
    "scaler.fit(X_new) #fit，本质是生成均值和方差\n",
    "scaler.mean_ #查看均值的属性mean_\n",
    "scaler.var_ #查看方差的属性var_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 279,
   "id": "501c16dd",
   "metadata": {},
   "outputs": [],
   "source": [
    "X_input = scaler.fit_transform(X_no_inf) #使用fit_transform(data)一步达成结果\n",
    "#scaler.inverse_transform(x_std) #使用inverse_transform逆转标准化"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "226da458",
   "metadata": {},
   "source": [
    "# 把上面的X_input和word2vec函数连接在一起"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 246,
   "id": "77c27535",
   "metadata": {},
   "outputs": [],
   "source": [
    "df_X_input = pd.DataFrame(X_input)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 253,
   "id": "c48302f6",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 这个把数据框连接在一起，然后直接返回拼接后的array\n",
    "X_input2 = np.concatenate((df_X_input,word2vec_new),axis = 1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 254,
   "id": "27882009",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(998, 237)"
      ]
     },
     "execution_count": 254,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X_input2.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 257,
   "id": "a6ab2312",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "998"
      ]
     },
     "execution_count": 257,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "len(X_input2)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c13311d6",
   "metadata": {},
   "source": [
    "## 开始训练"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 277,
   "id": "456dac64",
   "metadata": {},
   "outputs": [],
   "source": [
    "X_train, X_test, y_train, y_test = train_test_split(X_input, score, test_size = 0.2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 281,
   "id": "7a769a34",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "预测分数：10.641700075383772 实际分数：13.0\n",
      "预测分数：16.672950075383774 实际分数：18.5\n",
      "预测分数：15.084571169133772 实际分数：16.0\n",
      "预测分数：12.610450075383772 实际分数：6.5\n",
      "预测分数：14.510840700383772 实际分数：16.5\n",
      "预测分数：14.123145387883772 实际分数：15.5\n",
      "预测分数：12.338965700383772 实际分数：12.5\n",
      "预测分数：13.887793825383772 实际分数：15.5\n",
      "预测分数：18.172950075383774 实际分数：20.0\n",
      "预测分数：14.863868044133772 实际分数：17.0\n",
      "预测分数：18.295996950383774 实际分数：20.5\n",
      "预测分数：16.690528200383774 实际分数：18.5\n",
      "预测分数：16.337012575383774 实际分数：19.5\n",
      "预测分数：17.885840700383774 实际分数：19.5\n",
      "预测分数：11.553077028508772 实际分数：15.0\n",
      "预测分数：16.642676637883774 实际分数：17.5\n",
      "预测分数：12.180762575383772 实际分数：9.0\n",
      "预测分数：16.243262575383774 实际分数：20.5\n",
      "预测分数：14.629981325383772 实际分数：17.0\n",
      "预测分数：15.279883669133772 实际分数：19.5\n",
      "预测分数：16.883887575383774 实际分数：20.0\n",
      "预测分数：16.825293825383774 实际分数：14.0\n",
      "预测分数：10.200293825383772 实际分数：4.5\n",
      "预测分数：15.911231325383772 实际分数：19.0\n",
      "预测分数：6.821387575383772 实际分数：7.5\n",
      "预测分数：14.581153200383772 实际分数：14.0\n",
      "预测分数：15.942481325383772 实际分数：13.5\n",
      "预测分数：15.410254762883772 实际分数：15.0\n",
      "预测分数：18.665137575383774 实际分数：14.0\n",
      "预测分数：13.488379762883772 实际分数：15.0\n",
      "预测分数：19.821387575383774 实际分数：20.5\n",
      "预测分数：19.745215700383774 实际分数：19.5\n",
      "预测分数：16.121680544133774 实际分数：14.5\n",
      "预测分数：18.622168825383774 实际分数：16.0\n",
      "预测分数：15.855078981633772 实际分数：18.0\n",
      "预测分数：17.051368044133774 实际分数：12.5\n",
      "预测分数：17.210059450383774 实际分数：17.5\n",
      "预测分数：16.347510622258774 实际分数：16.0\n",
      "预测分数：16.532325075383774 实际分数：19.0\n",
      "预测分数：15.559180544133772 实际分数：15.0\n",
      "预测分数：14.643653200383772 实际分数：17.5\n",
      "预测分数：-0.10439367461622773 实际分数：0.0\n",
      "预测分数：15.856543825383772 实际分数：15.5\n",
      "预测分数：15.286231325383772 实际分数：13.5\n",
      "预测分数：17.383887575383774 实际分数：19.5\n",
      "预测分数：16.149268434758774 实际分数：14.5\n",
      "预测分数：18.647559450383774 实际分数：20.5\n",
      "预测分数：12.497168825383772 实际分数：13.5\n",
      "预测分数：15.200293825383772 实际分数：16.0\n",
      "预测分数：16.719825075383774 实际分数：14.5\n",
      "预测分数：18.065528200383774 实际分数：20.5\n",
      "预测分数：16.512793825383774 实际分数：14.5\n",
      "预测分数：13.228614137883772 实际分数：15.0\n",
      "预测分数：13.559668825383772 实际分数：12.0\n",
      "预测分数：14.814063356633772 实际分数：11.5\n",
      "预测分数：17.406348512883774 实际分数：17.0\n",
      "预测分数：14.504493044133772 实际分数：16.5\n",
      "预测分数：14.075293825383772 实际分数：12.5\n",
      "预测分数：13.161231325383772 实际分数：17.5\n",
      "预测分数：12.032325075383772 实际分数：2.0\n",
      "预测分数：14.962989137883772 实际分数：13.0\n",
      "预测分数：15.617286012883772 实际分数：15.5\n",
      "预测分数：20.989356325383774 实际分数：15.5\n",
      "预测分数：17.868262575383774 实际分数：15.5\n",
      "预测分数：16.829200075383774 实际分数：16.0\n",
      "预测分数：15.333106325383772 实际分数：15.5\n",
      "预测分数：15.462989137883772 实际分数：16.5\n",
      "预测分数：15.009864137883772 实际分数：18.0\n",
      "预测分数：17.802588747258774 实际分数：19.5\n",
      "预测分数：17.401465700383774 实际分数：18.5\n",
      "预测分数：14.269629762883772 实际分数：12.5\n",
      "预测分数：16.360450075383774 实际分数：15.5\n",
      "预测分数：19.544043825383774 实际分数：19.0\n",
      "预测分数：16.414161012883774 实际分数：14.5\n",
      "预测分数：21.614356325383774 实际分数：17.0\n",
      "预测分数：13.867041872258772 实际分数：16.5\n",
      "预测分数：15.329200075383772 实际分数：15.5\n",
      "预测分数：-2.0887686746162277 实际分数：1.0\n",
      "预测分数：17.594825075383774 实际分数：20.0\n",
      "预测分数：15.184668825383772 实际分数：12.5\n",
      "预测分数：20.009864137883774 实际分数：19.5\n",
      "预测分数：15.086036012883772 实际分数：17.0\n",
      "预测分数：18.723731325383774 实际分数：19.0\n",
      "预测分数：16.706153200383774 实际分数：18.0\n",
      "预测分数：21.560645387883774 实际分数：19.0\n",
      "预测分数：17.037207887883774 实际分数：19.0\n",
      "预测分数：17.844336794133774 实际分数：17.0\n",
      "预测分数：20.003028200383774 实际分数：15.0\n",
      "预测分数：13.215430544133772 实际分数：16.5\n",
      "预测分数：17.178809450383774 实际分数：22.0\n",
      "预测分数：16.411231325383774 实际分数：17.0\n",
      "预测分数：15.946387575383772 实际分数：13.0\n",
      "预测分数：15.300391481633772 实际分数：14.0\n",
      "预测分数：17.493262575383774 实际分数：11.5\n",
      "预测分数：15.356543825383772 实际分数：19.0\n",
      "预测分数：19.309668825383774 实际分数：12.5\n",
      "预测分数：15.942481325383772 实际分数：13.5\n",
      "预测分数：15.967871950383772 实际分数：17.0\n",
      "预测分数：17.647559450383774 实际分数：18.0\n",
      "预测分数：11.799903200383772 实际分数：14.0\n",
      "预测分数：15.709082887883772 实际分数：17.0\n",
      "预测分数：16.232032106633774 实际分数：13.0\n",
      "预测分数：19.429786012883774 实际分数：18.5\n",
      "预测分数：-4.139549924616228 实际分数：0.5\n",
      "预测分数：16.254981325383774 实际分数：15.5\n",
      "预测分数：17.050879762883774 实际分数：20.0\n",
      "预测分数：16.700293825383774 实际分数：15.5\n",
      "预测分数：19.125098512883774 实际分数：23.0\n",
      "预测分数：19.030371950383774 实际分数：17.5\n",
      "预测分数：19.337012575383774 实际分数：19.0\n",
      "预测分数：18.415137575383774 实际分数：18.0\n",
      "预测分数：18.139746950383774 实际分数：20.0\n",
      "预测分数：14.739844606633772 实际分数：16.0\n",
      "预测分数：12.143653200383772 实际分数：13.5\n",
      "预测分数：18.823340700383774 实际分数：15.0\n",
      "预测分数：0.2706063253837723 实际分数：0.0\n",
      "预测分数：16.339698122258774 实际分数：19.5\n",
      "预测分数：16.597754762883774 实际分数：11.5\n",
      "预测分数：15.661231325383772 实际分数：15.5\n",
      "预测分数：19.852637575383774 实际分数：19.5\n",
      "预测分数：19.194922731633774 实际分数：18.5\n",
      "预测分数：17.801856325383774 实际分数：16.0\n",
      "预测分数：-0.10439367461622773 实际分数：0.0\n",
      "预测分数：-0.10439367461622773 实际分数：0.0\n",
      "预测分数：16.864356325383774 实际分数：16.0\n",
      "预测分数：12.730445192571272 实际分数：11.5\n",
      "预测分数：18.040137575383774 实际分数：22.5\n",
      "预测分数：-0.10439367461622773 实际分数：0.0\n",
      "预测分数：16.075293825383774 实际分数：19.0\n",
      "预测分数：16.43427209686815 实际分数：18.0\n",
      "预测分数：20.378028200383774 实际分数：17.0\n",
      "预测分数：16.004859255071274 实际分数：17.0\n",
      "预测分数：16.024512575383774 实际分数：18.5\n",
      "预测分数：19.798926637883774 实际分数：17.0\n",
      "预测分数：19.079200075383774 实际分数：17.5\n",
      "预测分数：16.544043825383774 实际分数：16.5\n",
      "预测分数：17.780371950383774 实际分数：17.0\n",
      "预测分数：15.766700075383772 实际分数：14.5\n",
      "预测分数：14.749121950383772 实际分数：19.5\n",
      "预测分数：16.254981325383774 实际分数：12.0\n",
      "预测分数：15.948340700383772 实际分数：16.5\n",
      "预测分数：16.619239137883774 实际分数：21.5\n",
      "预测分数：15.932715700383772 实际分数：16.5\n",
      "预测分数：12.965918825383772 实际分数：14.0\n",
      "预测分数：17.907325075383774 实际分数：16.0\n",
      "预测分数：20.868262575383774 实际分数：14.5\n",
      "预测分数：17.129981325383774 实际分数：15.0\n",
      "预测分数：16.009864137883774 实际分数：18.0\n",
      "预测分数：15.035254762883772 实际分数：19.0\n",
      "预测分数：18.987403200383774 实际分数：20.5\n",
      "预测分数：15.112403200383772 实际分数：10.5\n",
      "预测分数：15.562598512883772 实际分数：18.0\n",
      "预测分数：13.582129762883772 实际分数：14.0\n",
      "预测分数：19.156348512883774 实际分数：20.0\n",
      "预测分数：14.579200075383772 实际分数：17.0\n",
      "预测分数：17.088965700383774 实际分数：22.0\n",
      "预测分数：18.829200075383774 实际分数：20.0\n",
      "预测分数：15.740332887883772 实际分数：14.0\n",
      "预测分数：15.733496950383772 实际分数：14.0\n",
      "预测分数：14.856543825383772 实际分数：20.5\n",
      "预测分数：12.385840700383772 实际分数：16.0\n",
      "预测分数：18.820411012883774 实际分数：18.5\n",
      "预测分数：16.272559450383774 实际分数：15.5\n",
      "预测分数：16.608619020696274 实际分数：20.0\n",
      "预测分数：17.402442262883774 实际分数：19.0\n",
      "预测分数：14.485450075383772 实际分数：16.5\n",
      "预测分数：16.994727419133774 实际分数：11.0\n",
      "预测分数：18.672950075383774 实际分数：20.0\n",
      "预测分数：18.671973512883774 实际分数：21.0\n",
      "预测分数：6.766700075383772 实际分数：13.5\n",
      "预测分数：13.282325075383772 实际分数：13.5\n",
      "预测分数：18.710059450383774 实际分数：16.5\n",
      "预测分数：16.590918825383774 实际分数：17.0\n",
      "预测分数：7.022559450383772 实际分数：5.0\n",
      "预测分数：19.481543825383774 实际分数：19.0\n",
      "预测分数：14.137793825383772 实际分数：14.5\n",
      "预测分数：13.067481325383772 实际分数：15.0\n",
      "预测分数：15.420996950383772 实际分数：17.0\n",
      "预测分数：17.331153200383774 实际分数：16.5\n",
      "预测分数：-0.10439367461622773 实际分数：0.0\n",
      "预测分数：17.876075075383774 实际分数：20.0\n",
      "预测分数：16.944434450383774 实际分数：16.5\n",
      "预测分数：14.379981325383772 实际分数：13.0\n",
      "预测分数：15.106543825383772 实际分数：10.5\n",
      "预测分数：17.002051637883774 实际分数：17.5\n",
      "预测分数：12.581153200383772 实际分数：13.5\n",
      "预测分数：12.860450075383772 实际分数：5.0\n",
      "预测分数：14.532325075383772 实际分数：15.0\n",
      "预测分数：17.506934450383774 实际分数：16.5\n",
      "预测分数：20.633887575383774 实际分数：17.5\n",
      "预测分数：13.688575075383772 实际分数：15.5\n",
      "预测分数：17.917090700383774 实际分数：16.0\n",
      "预测分数：15.282325075383772 实际分数：18.0\n",
      "预测分数：17.817481325383774 实际分数：17.5\n",
      "预测分数：17.965918825383774 实际分数：15.0\n",
      "预测分数：15.717871950383772 实际分数：16.0\n",
      "预测分数：21.819434450383774 实际分数：19.5\n",
      "预测分数：17.314063356633774 实际分数：18.0\n",
      "预测分数：14.855567262883772 实际分数：14.0\n",
      "预测分数：17.105567262883774 实际分数：18.0\n",
      "测试集得分：\n",
      " 0.6411000799716126\n",
      "LinearRegression Mean squared error: 7.31\n",
      "--------------------------------------------------\n"
     ]
    }
   ],
   "source": [
    "linear_regressor = LinearRegression()\n",
    "linear_regressor.fit(X_train, y_train)\n",
    "y_pred = linear_regressor.predict(X_test)\n",
    "for i in range(len(y_test)):\n",
    "    print(\"预测分数：{}\".format(y_pred[i]),\"实际分数：{}\".format(y_test[i]))\n",
    "# The coefficients 表示每一个特征所占的权重\n",
    "print(\"测试集得分：\\n\",linear_regressor.score(X_test,y_test))\n",
    "#print('LinearRegression Coefficients: \\n', linear_regressor.coef_)\n",
    "# The mean squared error\n",
    "print(\"LinearRegression Mean squared error: %.2f\" % mean_squared_error(y_test, y_pred))\n",
    "# 平均绝对百分比误差（Mean Absolute Percentage Error）\n",
    "#print('LinearRegression MAPE:%.2f' % np.average(np.abs((y_test-y_pred)/y_test)))\n",
    "#print(\"R2:%f\"% r2_score(y_test, y_pred))\n",
    "print('-' * 50)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 282,
   "id": "ed255228",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "测试集得分：\n",
      " 0.6437570339589143\n",
      "Ridge Mean squared error: 7.25\n",
      "--------------------------------------------------\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "'\\nV4:\\n测试集得分：\\n 0.6850381823446672\\nRidge Mean squared error: 7.63\\n'"
      ]
     },
     "execution_count": 282,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.metrics import classification_report\n",
    "alpha = 200\n",
    "ridge = Ridge(alpha=alpha)# 正则项的程度\n",
    "ridge.fit(X_train, y_train)\n",
    "y_pred = ridge.predict(X_test)\n",
    "print(\"测试集得分：\\n {0}\".format(ridge.score(X_test,y_test)))\n",
    "#print('Ridge Coefficients: \\n', ridge.coef_)\n",
    "print(\"Ridge Mean squared error: %.2f\" % mean_squared_error(y_test, y_pred))\n",
    "#print(\"R2:%f\"% r2_score(y_test, y_pred))\n",
    "#print('Ridge MAPE:%.2f' % np.average(np.abs((y_test-y_pred)/y_test)))\n",
    "\n",
    "#print(classification_report(np.rint(y_pred), np.rint(y_test)))\n",
    "print('-' * 50)\n",
    "\n",
    "# 最佳：\n",
    "'''\n",
    "V4:\n",
    "测试集得分：\n",
    " 0.6850381823446672\n",
    "Ridge Mean squared error: 7.63\n",
    "'''"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 283,
   "id": "1a61796b",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Single Tree:0.075 Random Forest:0.135\n",
      "预测分数：140 实际分数：130\n",
      "预测分数：190 实际分数：185\n",
      "预测分数：175 实际分数：160\n",
      "预测分数：120 实际分数：65\n",
      "预测分数：150 实际分数：165\n",
      "预测分数：150 实际分数：155\n",
      "预测分数：150 实际分数：125\n",
      "预测分数：120 实际分数：155\n",
      "预测分数：195 实际分数：200\n",
      "预测分数：170 实际分数：170\n",
      "预测分数：205 实际分数：205\n",
      "预测分数：175 实际分数：185\n",
      "预测分数：160 实际分数：195\n",
      "预测分数：185 实际分数：195\n",
      "预测分数：120 实际分数：150\n",
      "预测分数：170 实际分数：175\n",
      "预测分数：170 实际分数：90\n",
      "预测分数：165 实际分数：205\n",
      "预测分数：170 实际分数：170\n",
      "预测分数：170 实际分数：195\n",
      "预测分数：185 实际分数：200\n",
      "预测分数：175 实际分数：140\n",
      "预测分数：135 实际分数：45\n",
      "预测分数：130 实际分数：190\n",
      "预测分数：110 实际分数：75\n",
      "预测分数：140 实际分数：140\n",
      "预测分数：175 实际分数：135\n",
      "预测分数：175 实际分数：150\n",
      "预测分数：170 实际分数：140\n",
      "预测分数：170 实际分数：150\n",
      "预测分数：175 实际分数：205\n",
      "预测分数：195 实际分数：195\n",
      "预测分数：125 实际分数：145\n",
      "预测分数：160 实际分数：160\n",
      "预测分数：175 实际分数：180\n",
      "预测分数：170 实际分数：125\n",
      "预测分数：170 实际分数：175\n",
      "预测分数：150 实际分数：160\n",
      "预测分数：175 实际分数：190\n",
      "预测分数：170 实际分数：150\n",
      "预测分数：195 实际分数：175\n",
      "预测分数：0 实际分数：0\n",
      "预测分数：150 实际分数：155\n",
      "预测分数：165 实际分数：135\n",
      "预测分数：190 实际分数：195\n",
      "预测分数：190 实际分数：145\n",
      "预测分数：175 实际分数：205\n",
      "预测分数：150 实际分数：135\n",
      "预测分数：160 实际分数：160\n",
      "预测分数：155 实际分数：145\n",
      "预测分数：160 实际分数：205\n",
      "预测分数：185 实际分数：145\n",
      "预测分数：175 实际分数：150\n",
      "预测分数：135 实际分数：120\n",
      "预测分数：135 实际分数：115\n",
      "预测分数：175 实际分数：170\n",
      "预测分数：175 实际分数：165\n",
      "预测分数：160 实际分数：125\n",
      "预测分数：120 实际分数：175\n",
      "预测分数：120 实际分数：20\n",
      "预测分数：120 实际分数：130\n",
      "预测分数：175 实际分数：155\n",
      "预测分数：175 实际分数：155\n",
      "预测分数：160 实际分数：155\n",
      "预测分数：185 实际分数：160\n",
      "预测分数：195 实际分数：155\n",
      "预测分数：170 实际分数：165\n",
      "预测分数：155 实际分数：180\n",
      "预测分数：170 实际分数：195\n",
      "预测分数：170 实际分数：185\n",
      "预测分数：165 实际分数：125\n",
      "预测分数：170 实际分数：155\n",
      "预测分数：220 实际分数：190\n",
      "预测分数：155 实际分数：145\n",
      "预测分数：175 实际分数：170\n",
      "预测分数：175 实际分数：165\n",
      "预测分数：185 实际分数：155\n",
      "预测分数：25 实际分数：10\n",
      "预测分数：205 实际分数：200\n",
      "预测分数：180 实际分数：125\n",
      "预测分数：195 实际分数：195\n",
      "预测分数：155 实际分数：170\n",
      "预测分数：195 实际分数：190\n",
      "预测分数：155 实际分数：180\n",
      "预测分数：175 实际分数：190\n",
      "预测分数：170 实际分数：190\n",
      "预测分数：160 实际分数：170\n",
      "预测分数：175 实际分数：150\n",
      "预测分数：150 实际分数：165\n",
      "预测分数：170 实际分数：220\n",
      "预测分数：170 实际分数：170\n",
      "预测分数：140 实际分数：130\n",
      "预测分数：150 实际分数：140\n",
      "预测分数：175 实际分数：115\n",
      "预测分数：185 实际分数：190\n",
      "预测分数：160 实际分数：125\n",
      "预测分数：185 实际分数：135\n",
      "预测分数：175 实际分数：170\n",
      "预测分数：175 实际分数：180\n",
      "预测分数：125 实际分数：140\n",
      "预测分数：190 实际分数：170\n",
      "预测分数：185 实际分数：130\n",
      "预测分数：155 实际分数：185\n",
      "预测分数：25 实际分数：5\n",
      "预测分数：175 实际分数：155\n",
      "预测分数：175 实际分数：200\n",
      "预测分数：170 实际分数：155\n",
      "预测分数：170 实际分数：230\n",
      "预测分数：175 实际分数：175\n",
      "预测分数：185 实际分数：190\n",
      "预测分数：180 实际分数：180\n",
      "预测分数：180 实际分数：200\n",
      "预测分数：150 实际分数：160\n",
      "预测分数：185 实际分数：135\n",
      "预测分数：180 实际分数：150\n",
      "预测分数：0 实际分数：0\n",
      "预测分数：160 实际分数：195\n",
      "预测分数：160 实际分数：115\n",
      "预测分数：160 实际分数：155\n",
      "预测分数：185 实际分数：195\n",
      "预测分数：205 实际分数：185\n",
      "预测分数：150 实际分数：160\n",
      "预测分数：0 实际分数：0\n",
      "预测分数：0 实际分数：0\n",
      "预测分数：160 实际分数：160\n",
      "预测分数：140 实际分数：115\n",
      "预测分数：175 实际分数：225\n",
      "预测分数：0 实际分数：0\n",
      "预测分数：160 实际分数：190\n",
      "预测分数：170 实际分数：180\n",
      "预测分数：180 实际分数：170\n",
      "预测分数：185 实际分数：170\n",
      "预测分数：135 实际分数：185\n",
      "预测分数：170 实际分数：170\n",
      "预测分数：165 实际分数：175\n",
      "预测分数：165 实际分数：165\n",
      "预测分数：170 实际分数：170\n",
      "预测分数：165 实际分数：145\n",
      "预测分数：175 实际分数：195\n",
      "预测分数：175 实际分数：120\n",
      "预测分数：160 实际分数：165\n",
      "预测分数：175 实际分数：215\n",
      "预测分数：170 实际分数：165\n",
      "预测分数：130 实际分数：140\n",
      "预测分数：165 实际分数：160\n",
      "预测分数：185 实际分数：145\n",
      "预测分数：185 实际分数：150\n",
      "预测分数：130 实际分数：180\n",
      "预测分数：175 实际分数：190\n",
      "预测分数：205 实际分数：205\n",
      "预测分数：125 实际分数：105\n",
      "预测分数：160 实际分数：180\n",
      "预测分数：110 实际分数：140\n",
      "预测分数：170 实际分数：200\n",
      "预测分数：150 实际分数：170\n",
      "预测分数：190 实际分数：220\n",
      "预测分数：190 实际分数：200\n",
      "预测分数：170 实际分数：140\n",
      "预测分数：170 实际分数：140\n",
      "预测分数：135 实际分数：205\n",
      "预测分数：160 实际分数：160\n",
      "预测分数：205 实际分数：185\n",
      "预测分数：175 实际分数：155\n",
      "预测分数：170 实际分数：200\n",
      "预测分数：170 实际分数：190\n",
      "预测分数：160 实际分数：165\n",
      "预测分数：155 实际分数：110\n",
      "预测分数：170 实际分数：200\n",
      "预测分数：150 实际分数：210\n",
      "预测分数：120 实际分数：135\n",
      "预测分数：135 实际分数：135\n",
      "预测分数：175 实际分数：165\n",
      "预测分数：150 实际分数：170\n",
      "预测分数：120 实际分数：50\n",
      "预测分数：170 实际分数：190\n",
      "预测分数：170 实际分数：145\n",
      "预测分数：160 实际分数：150\n",
      "预测分数：150 实际分数：170\n",
      "预测分数：175 实际分数：165\n",
      "预测分数：0 实际分数：0\n",
      "预测分数：205 实际分数：200\n",
      "预测分数：175 实际分数：165\n",
      "预测分数：140 实际分数：130\n",
      "预测分数：150 实际分数：105\n",
      "预测分数：175 实际分数：175\n",
      "预测分数：135 实际分数：135\n",
      "预测分数：160 实际分数：50\n",
      "预测分数：170 实际分数：150\n",
      "预测分数：185 实际分数：165\n",
      "预测分数：175 实际分数：175\n",
      "预测分数：150 实际分数：155\n",
      "预测分数：175 实际分数：160\n",
      "预测分数：155 实际分数：180\n",
      "预测分数：170 实际分数：175\n",
      "预测分数：165 实际分数：150\n",
      "预测分数：180 实际分数：160\n",
      "预测分数：185 实际分数：195\n",
      "预测分数：175 实际分数：180\n",
      "预测分数：160 实际分数：140\n",
      "预测分数：185 实际分数：180\n"
     ]
    }
   ],
   "source": [
    "# 分别使用树和随机森林\n",
    "%matplotlib inline\n",
    "from sklearn.tree import DecisionTreeClassifier\n",
    "from sklearn.ensemble import RandomForestClassifier\n",
    "clf = DecisionTreeClassifier(random_state=0)\n",
    "rfc = RandomForestClassifier(random_state=0)\n",
    "y_train_new = y_train*10\n",
    "y_test_new = y_test*10\n",
    "y_test_new = y_test_new.astype(\"int\")\n",
    "\n",
    "#fit模型\n",
    "clf = clf.fit(X_train,y_train_new.astype(\"int\"))\n",
    "rfc = rfc.fit(X_train,y_train_new.astype(\"int\"))\n",
    "\n",
    "#输出分数\n",
    "score_c = clf.score(X_test,y_test_new.astype(\"int\"))\n",
    "score_r = rfc.score(X_test,y_test_new.astype(\"int\"))\n",
    "\n",
    "print(\"Single Tree:{}\".format(score_c),\"Random Forest:{}\".format(score_r))\n",
    "\n",
    "#-----------------------------------------#\n",
    "# 查看测试结果\n",
    "y_pred = rfc.predict(X_test)\n",
    "for i in range(len(y_test_new)):\n",
    "    print(\"预测分数：{}\".format(y_pred[i]),\"实际分数：{}\".format(y_test_new[i]))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 284,
   "id": "8f834e79",
   "metadata": {},
   "outputs": [],
   "source": [
    "score_new = score*10\n",
    "score_new = score_new.astype(\"int\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 263,
   "id": "fe29a232",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "D:\\Program\\anaconda\\lib\\site-packages\\sklearn\\model_selection\\_split.py:666: UserWarning: The least populated class in y has only 1 members, which is less than n_splits=10.\n",
      "  warnings.warn((\"The least populated class in y has only %d\"\n",
      "D:\\Program\\anaconda\\lib\\site-packages\\sklearn\\model_selection\\_split.py:666: UserWarning: The least populated class in y has only 1 members, which is less than n_splits=10.\n",
      "  warnings.warn((\"The least populated class in y has only %d\"\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 分类树绘制\n",
    "from sklearn.model_selection import cross_val_score\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "rfc = RandomForestClassifier(n_estimators=25)\n",
    "rfc_s = cross_val_score(rfc,X_input,score_new,cv=10)\n",
    "clf = DecisionTreeClassifier()\n",
    "clf_s = cross_val_score(clf,X_input,score_new,cv=10)\n",
    "\n",
    "plt.plot(range(1,11),rfc_s,label = \"RandomForest\")\n",
    "plt.plot(range(1,11),clf_s,label = \"Decision Tree\")\n",
    "plt.legend()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 286,
   "id": "5bb39a23",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Wall time: 2min 54s\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "GridSearchCV(estimator=RandomForestRegressor(),\n",
       "             param_grid={'max_depth': [10, 50, 100], 'max_features': [2, 5, 10],\n",
       "                         'n_estimators': range(50, 70)})"
      ]
     },
     "execution_count": 286,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "%%time\n",
    "# 随机森林回归测试，得到一个grid模型\n",
    "rf = ensemble.RandomForestRegressor()\n",
    "params = {'n_estimators': range(50,70,1), 'max_depth':[10, 50, 100], 'max_features':[2, 5, 10]}\n",
    "grid = GridSearchCV(estimator=rf, param_grid=params)\n",
    "grid.fit(X_train, y_train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 287,
   "id": "e0c5a391",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 数据探索\n",
    "y_pred = grid.predict(X_test)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 288,
   "id": "c0be6681",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "预测分数：11.08 实际分数：13.0\n",
      "预测分数：16.32 实际分数：18.5\n",
      "预测分数：17.87 实际分数：16.0\n",
      "预测分数：11.82 实际分数：6.5\n",
      "预测分数：15.03 实际分数：16.5\n",
      "预测分数：14.37 实际分数：15.5\n",
      "预测分数：14.36 实际分数：12.5\n",
      "预测分数：13.45 实际分数：15.5\n",
      "预测分数：18.40 实际分数：20.0\n",
      "预测分数：15.04 实际分数：17.0\n",
      "预测分数：18.06 实际分数：20.5\n",
      "预测分数：17.19 实际分数：18.5\n",
      "预测分数：17.61 实际分数：19.5\n",
      "预测分数：18.03 实际分数：19.5\n",
      "预测分数：11.11 实际分数：15.0\n",
      "预测分数：14.94 实际分数：17.5\n",
      "预测分数：14.00 实际分数：9.0\n",
      "预测分数：16.62 实际分数：20.5\n",
      "预测分数：16.25 实际分数：17.0\n",
      "预测分数：17.51 实际分数：19.5\n",
      "预测分数：17.79 实际分数：20.0\n",
      "预测分数：17.44 实际分数：14.0\n",
      "预测分数：10.90 实际分数：4.5\n",
      "预测分数：16.09 实际分数：19.0\n",
      "预测分数：8.08 实际分数：7.5\n",
      "预测分数：14.75 实际分数：14.0\n",
      "预测分数：16.69 实际分数：13.5\n",
      "预测分数：16.73 实际分数：15.0\n",
      "预测分数：18.57 实际分数：14.0\n",
      "预测分数：16.41 实际分数：15.0\n",
      "预测分数：18.57 实际分数：20.5\n",
      "预测分数：18.01 实际分数：19.5\n",
      "预测分数：13.26 实际分数：14.5\n",
      "预测分数：17.19 实际分数：16.0\n",
      "预测分数：17.73 实际分数：18.0\n",
      "预测分数：15.81 实际分数：12.5\n",
      "预测分数：16.84 实际分数：17.5\n",
      "预测分数：15.78 实际分数：16.0\n",
      "预测分数：15.86 实际分数：19.0\n",
      "预测分数：15.70 实际分数：15.0\n",
      "预测分数：16.29 实际分数：17.5\n",
      "预测分数：0.00 实际分数：0.0\n",
      "预测分数：15.71 实际分数：15.5\n",
      "预测分数：16.89 实际分数：13.5\n",
      "预测分数：16.89 实际分数：19.5\n",
      "预测分数：17.35 实际分数：14.5\n",
      "预测分数：17.95 实际分数：20.5\n",
      "预测分数：14.27 实际分数：13.5\n",
      "预测分数：15.88 实际分数：16.0\n",
      "预测分数：16.44 实际分数：14.5\n",
      "预测分数：17.91 实际分数：20.5\n",
      "预测分数：17.11 实际分数：14.5\n",
      "预测分数：15.70 实际分数：15.0\n",
      "预测分数：12.56 实际分数：12.0\n",
      "预测分数：12.61 实际分数：11.5\n",
      "预测分数：17.31 实际分数：17.0\n",
      "预测分数：16.56 实际分数：16.5\n",
      "预测分数：15.03 实际分数：12.5\n",
      "预测分数：12.88 实际分数：17.5\n",
      "预测分数：14.71 实际分数：2.0\n",
      "预测分数：12.25 实际分数：13.0\n",
      "预测分数：15.71 实际分数：15.5\n",
      "预测分数：16.85 实际分数：15.5\n",
      "预测分数：17.79 实际分数：15.5\n",
      "预测分数：16.66 实际分数：16.0\n",
      "预测分数：15.49 实际分数：15.5\n",
      "预测分数：16.54 实际分数：16.5\n",
      "预测分数：15.96 实际分数：18.0\n",
      "预测分数：16.39 实际分数：19.5\n",
      "预测分数：16.69 实际分数：18.5\n",
      "预测分数：15.64 实际分数：12.5\n",
      "预测分数：16.97 实际分数：15.5\n",
      "预测分数：18.72 实际分数：19.0\n",
      "预测分数：14.81 实际分数：14.5\n",
      "预测分数：18.78 实际分数：17.0\n",
      "预测分数：16.34 实际分数：16.5\n",
      "预测分数：15.73 实际分数：15.5\n",
      "预测分数：3.22 实际分数：1.0\n",
      "预测分数：18.28 实际分数：20.0\n",
      "预测分数：15.97 实际分数：12.5\n",
      "预测分数：18.78 实际分数：19.5\n",
      "预测分数：15.68 实际分数：17.0\n",
      "预测分数：17.83 实际分数：19.0\n",
      "预测分数：16.56 实际分数：18.0\n",
      "预测分数：18.28 实际分数：19.0\n",
      "预测分数：17.69 实际分数：19.0\n",
      "预测分数：17.33 实际分数：17.0\n",
      "预测分数：17.88 实际分数：15.0\n",
      "预测分数：15.41 实际分数：16.5\n",
      "预测分数：15.69 实际分数：22.0\n",
      "预测分数：15.89 实际分数：17.0\n",
      "预测分数：14.44 实际分数：13.0\n",
      "预测分数：16.94 实际分数：14.0\n",
      "预测分数：17.23 实际分数：11.5\n",
      "预测分数：17.17 实际分数：19.0\n",
      "预测分数：18.10 实际分数：12.5\n",
      "预测分数：16.57 实际分数：13.5\n",
      "预测分数：17.71 实际分数：17.0\n",
      "预测分数：17.69 实际分数：18.0\n",
      "预测分数：12.05 实际分数：14.0\n",
      "预测分数：17.03 实际分数：17.0\n",
      "预测分数：17.45 实际分数：13.0\n",
      "预测分数：17.77 实际分数：18.5\n",
      "预测分数：2.68 实际分数：0.5\n",
      "预测分数：16.63 实际分数：15.5\n",
      "预测分数：16.93 实际分数：20.0\n",
      "预测分数：15.98 实际分数：15.5\n",
      "预测分数：18.19 实际分数：23.0\n",
      "预测分数：18.18 实际分数：17.5\n",
      "预测分数：18.49 实际分数：19.0\n",
      "预测分数：17.40 实际分数：18.0\n",
      "预测分数：18.02 实际分数：20.0\n",
      "预测分数：16.10 实际分数：16.0\n",
      "预测分数：15.61 实际分数：13.5\n",
      "预测分数：17.52 实际分数：15.0\n",
      "预测分数：0.00 实际分数：0.0\n",
      "预测分数：15.71 实际分数：19.5\n",
      "预测分数：16.21 实际分数：11.5\n",
      "预测分数：16.83 实际分数：15.5\n",
      "预测分数：18.53 实际分数：19.5\n",
      "预测分数：18.31 实际分数：18.5\n",
      "预测分数：15.66 实际分数：16.0\n",
      "预测分数：0.00 实际分数：0.0\n",
      "预测分数：0.00 实际分数：0.0\n",
      "预测分数：17.39 实际分数：16.0\n",
      "预测分数：13.20 实际分数：11.5\n",
      "预测分数：18.15 实际分数：22.5\n",
      "预测分数：0.00 实际分数：0.0\n",
      "预测分数：17.73 实际分数：19.0\n",
      "预测分数：18.06 实际分数：18.0\n",
      "预测分数：18.20 实际分数：17.0\n",
      "预测分数：17.38 实际分数：17.0\n",
      "预测分数：16.22 实际分数：18.5\n",
      "预测分数：18.08 实际分数：17.0\n",
      "预测分数：17.91 实际分数：17.5\n",
      "预测分数：17.39 实际分数：16.5\n",
      "预测分数：17.70 实际分数：17.0\n",
      "预测分数：15.98 实际分数：14.5\n",
      "预测分数：15.02 实际分数：19.5\n",
      "预测分数：16.13 实际分数：12.0\n",
      "预测分数：17.81 实际分数：16.5\n",
      "预测分数：16.22 实际分数：21.5\n",
      "预测分数：15.78 实际分数：16.5\n",
      "预测分数：15.28 实际分数：14.0\n",
      "预测分数：18.18 实际分数：16.0\n",
      "预测分数：16.19 实际分数：14.5\n",
      "预测分数：16.66 实际分数：15.0\n",
      "预测分数：14.97 实际分数：18.0\n",
      "预测分数：15.83 实际分数：19.0\n",
      "预测分数：18.53 实际分数：20.5\n",
      "预测分数：15.20 实际分数：10.5\n",
      "预测分数：14.50 实际分数：18.0\n",
      "预测分数：13.36 实际分数：14.0\n",
      "预测分数：17.37 实际分数：20.0\n",
      "预测分数：15.86 实际分数：17.0\n",
      "预测分数：17.77 实际分数：22.0\n",
      "预测分数：18.53 实际分数：20.0\n",
      "预测分数：15.92 实际分数：14.0\n",
      "预测分数：15.55 实际分数：14.0\n",
      "预测分数：14.05 实际分数：20.5\n",
      "预测分数：16.01 实际分数：16.0\n",
      "预测分数：17.60 实际分数：18.5\n",
      "预测分数：18.00 实际分数：15.5\n",
      "预测分数：17.88 实际分数：20.0\n",
      "预测分数：17.53 实际分数：19.0\n",
      "预测分数：16.19 实际分数：16.5\n",
      "预测分数：16.40 实际分数：11.0\n",
      "预测分数：16.03 实际分数：20.0\n",
      "预测分数：17.21 实际分数：21.0\n",
      "预测分数：11.48 实际分数：13.5\n",
      "预测分数：14.77 实际分数：13.5\n",
      "预测分数：18.08 实际分数：16.5\n",
      "预测分数：16.67 实际分数：17.0\n",
      "预测分数：8.23 实际分数：5.0\n",
      "预测分数：18.13 实际分数：19.0\n",
      "预测分数：15.40 实际分数：14.5\n",
      "预测分数：14.90 实际分数：15.0\n",
      "预测分数：14.60 实际分数：17.0\n",
      "预测分数：17.85 实际分数：16.5\n",
      "预测分数：0.00 实际分数：0.0\n",
      "预测分数：17.38 实际分数：20.0\n",
      "预测分数：16.28 实际分数：16.5\n",
      "预测分数：15.03 实际分数：13.0\n",
      "预测分数：15.44 实际分数：10.5\n",
      "预测分数：17.11 实际分数：17.5\n",
      "预测分数：14.10 实际分数：13.5\n",
      "预测分数：14.47 实际分数：5.0\n",
      "预测分数：15.82 实际分数：15.0\n",
      "预测分数：17.41 实际分数：16.5\n",
      "预测分数：18.36 实际分数：17.5\n",
      "预测分数：13.92 实际分数：15.5\n",
      "预测分数：16.57 实际分数：16.0\n",
      "预测分数：14.90 实际分数：18.0\n",
      "预测分数：17.37 实际分数：17.5\n",
      "预测分数：17.51 实际分数：15.0\n",
      "预测分数：17.19 实际分数：16.0\n",
      "预测分数：19.18 实际分数：19.5\n",
      "预测分数：17.53 实际分数：18.0\n",
      "预测分数：15.44 实际分数：14.0\n",
      "预测分数：18.36 实际分数：18.0\n"
     ]
    }
   ],
   "source": [
    "for i in range(len(y_test)):\n",
    "    print(\"预测分数：{:.2f}\".format(y_pred[i]),\"实际分数：{}\".format(y_test[i]))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 289,
   "id": "3fb44af4",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "测试集最佳得分：\n",
      " 0.7487018816342377\n",
      "RandomForestRegressor(max_depth=100, max_features=10, n_estimators=54)\n",
      "{'max_depth': 100, 'max_features': 10, 'n_estimators': 54}\n",
      "Cohen's kappa score: 0.10\n",
      "--------------------------------------------------\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "array([11.08333333, 16.32407407, 17.87037037, 11.82407407, 15.02777778,\n",
       "       14.37037037, 14.36111111, 13.4537037 , 18.39814815, 15.03703704,\n",
       "       18.05555556, 17.18518519, 17.61111111, 18.02777778, 11.11111111,\n",
       "       14.94444444, 14.        , 16.62037037, 16.25      , 17.50925926,\n",
       "       17.78703704, 17.43518519, 10.89814815, 16.09259259,  8.08333333,\n",
       "       14.75      , 16.69444444, 16.73148148, 18.57407407, 16.40740741,\n",
       "       18.57407407, 18.00925926, 13.25925926, 17.18518519, 17.73148148,\n",
       "       15.80555556, 16.84259259, 15.77777778, 15.86111111, 15.7037037 ,\n",
       "       16.28703704,  0.        , 15.71296296, 16.88888889, 16.88888889,\n",
       "       17.35185185, 17.9537037 , 14.26851852, 15.87962963, 16.44444444,\n",
       "       17.90740741, 17.11111111, 15.7037037 , 12.55555556, 12.61111111,\n",
       "       17.31481481, 16.55555556, 15.02777778, 12.87962963, 14.71296296,\n",
       "       12.25      , 15.71296296, 16.85185185, 17.78703704, 16.65740741,\n",
       "       15.49074074, 16.53703704, 15.96296296, 16.38888889, 16.68518519,\n",
       "       15.63888889, 16.97222222, 18.72222222, 14.81481481, 18.77777778,\n",
       "       16.34259259, 15.73148148,  3.22222222, 18.27777778, 15.97222222,\n",
       "       18.77777778, 15.67592593, 17.83333333, 16.56481481, 18.27777778,\n",
       "       17.69444444, 17.33333333, 17.87962963, 15.40740741, 15.69444444,\n",
       "       15.88888889, 14.43518519, 16.94444444, 17.23148148, 17.16666667,\n",
       "       18.10185185, 16.57407407, 17.71296296, 17.69444444, 12.0462963 ,\n",
       "       17.02777778, 17.4537037 , 17.76851852,  2.67592593, 16.62962963,\n",
       "       16.92592593, 15.98148148, 18.18518519, 18.17592593, 18.49074074,\n",
       "       17.39814815, 18.01851852, 16.10185185, 15.61111111, 17.51851852,\n",
       "        0.        , 15.71296296, 16.21296296, 16.83333333, 18.52777778,\n",
       "       18.31481481, 15.65740741,  0.        ,  0.        , 17.38888889,\n",
       "       13.2037037 , 18.14814815,  0.        , 17.73148148, 18.06481481,\n",
       "       18.2037037 , 17.37962963, 16.22222222, 18.08333333, 17.90740741,\n",
       "       17.38888889, 17.7037037 , 15.98148148, 15.01851852, 16.12962963,\n",
       "       17.80555556, 16.22222222, 15.77777778, 15.27777778, 18.17592593,\n",
       "       16.19444444, 16.65740741, 14.97222222, 15.83333333, 18.52777778,\n",
       "       15.2037037 , 14.5       , 13.36111111, 17.37037037, 15.86111111,\n",
       "       17.76851852, 18.52777778, 15.91666667, 15.5462963 , 14.0462963 ,\n",
       "       16.00925926, 17.60185185, 18.        , 17.87962963, 17.52777778,\n",
       "       16.18518519, 16.39814815, 16.02777778, 17.21296296, 11.48148148,\n",
       "       14.76851852, 18.08333333, 16.66666667,  8.23148148, 18.12962963,\n",
       "       15.39814815, 14.89814815, 14.60185185, 17.85185185,  0.        ,\n",
       "       17.37962963, 16.27777778, 15.02777778, 15.44444444, 17.11111111,\n",
       "       14.10185185, 14.47222222, 15.82407407, 17.40740741, 18.36111111,\n",
       "       13.91666667, 16.57407407, 14.89814815, 17.37037037, 17.50925926,\n",
       "       17.19444444, 19.17592593, 17.52777778, 15.44444444, 18.36111111])"
      ]
     },
     "execution_count": 289,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "print(\"测试集最佳得分：\\n\",grid.best_score_)\n",
    "print(grid.best_estimator_)\n",
    "print(grid.best_params_)\n",
    "print('Cohen\\'s kappa score: %.2f' % cohen_kappa_score(np.rint(y_pred), np.rint(y_test)))\n",
    "print('-' * 50)\n",
    "\n",
    "y_pred"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "6203142d",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.8"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
